2017-11-19 1 views
0

Dies ist eine Frage dazu, wie Sie ein Bild mithilfe von ImageMagick oder ähnlichem korrigieren können.Passen Sie die Farben basierend auf dem bekannten HSV der Region im Bild an (mit ImageMagick o.ä.)

Wir haben ein Bild mit einem CMYK-Farbfeld. Das Muster wurde auf nicht-glänzendem weißem Karton gedruckt und wir haben den HSV des Cyan (unter realen Bedingungen) unter vorher festgelegten Lichtbedingungen gemessen. Wir nehmen dann dieses Muster auf den Kartenvorrat in den Vordergrund der anderen Bilder, die wir aufnehmen. Da die anderen Bilder alle unterschiedliche Lichtbedingungen haben, können wir die Farben der anderen Objekte im Bild nicht objektiv identifizieren.

Gibt es eine Möglichkeit, mithilfe von ImageMagick oder ähnlichem HSV-Werte im gesamten Bild zu verschieben, indem Cyan als Basis verwendet wird, sodass die Farbe oder die anderen Objekte im Bild ähnliche Werte aufweisen wie zuvor wurden sie unter den gleichen Lichtbedingungen wie das CMYK-Muster aufgenommen?

Kurz gesagt, unser Ziel ist es, in der Lage zu sein, mit einiger Genauigkeit den HSV von, sagen wir, "Gelb" zu bestimmen (die ohne genug Licht orange oder braun aussehen kann).

Ich habe ein paar Artikel gefunden, die Techniken vorschlagen, um ähnliche Dinge zu tun, aber nichts, was wir hier versuchen.

+0

Ein Gedanke ist, Ihr Bild in HSL oder HSV oder HCL umzuwandeln. Konvertieren Sie Ihr kalibriertes Cyan-Farbfeld in denselben Farbraum. Finde dann den Unterschied in den 3 Farbkanalwerten (H, S oder C, L oder V). Dann wandle das Bild in sRGB um, benutze -modulate, um das Bild um denselben Unterschied zu verschieben. Dann konvertieren Sie das Ergebnis zurück nach CMYK (vorausgesetzt, Ihre Eingabe war CMYK). Beachten Sie, dass -modulate Werte zwischen 0 und 200 hat, wobei 100 keine Änderung bedeutet. Sie müssen also die Werte für H, S oder C und L oder V entsprechend konvertieren. H ist das Schwierige, da es zwischen 0 und 360 liegt. Wenn Sie Hilfe brauchen, lassen Sie es mich wissen. – fmw42

+0

FORTSETZUNG: Sie können den Wert auch einfach durch Addition oder Multiplikation in den H-, S-, C-, L- oder V-Kanälen verschieben und zurück in Ihren ursprünglichen Farbraum konvertieren. Tun Sie dies, nachdem Sie die Farbunterschiede oder -verhältnisse von H, S oder C, L oder V aus den zwei Cyanbereichen erhalten haben. – fmw42

+0

Wow, tolle Antworten (aber ich kann das nicht als Antworten markieren, da du sie als Kommentare geschrieben hast). Das ist alles so neu für mich und es wird eine Weile dauern, diese Vorschläge zu testen. Wenn Sie ein konkretes Beispiel mit einem Beispielbild und dem erforderlichen Code bereitstellen können, wäre das sehr hilfreich. Vielen Dank! –

Antwort

1

Hier sind zwei triviale Ansätze mit ImageMagick und Unix-Tools.

Eingangsbild (von http://im.snibgo.com/dcrawwb.htm)

enter image description here

1) Erhalten des Referenz Cyanfarbe von http://xritephoto.com/documents/literature/en/ColorData-1p_EN.pdf

cyan_ref="srgb(8,133,161)" 

cyan_ref=`echo $cyan_ref | tr -cs "[0-9]*\n" " " | sed 's/^[ ]*//'` 
echo "$cyan_ref" 
8 133 161 

Separate die R-, G- und B-Werte

cyan_ref_r=`echo $cyan_ref | cut -d\ -f1` 
cyan_ref_g=`echo $cyan_ref | cut -d\ -f2` 
cyan_ref_b=`echo $cyan_ref | cut -d\ -f3` 

2) Beschneide ein kleines Rechteck aus dem Bild und erhalte die durchschnittlich gemessene Farbe für den Cyan-Patch. Konvertieren

enter image description here

cyan_mea=`convert cyan_measure.png -scale 1x1! -format "[pixel:u.p{0,0}]" info:` 

echo "cyan_mea=$cyan_mea" 
srgb(2,147,187) 

cyan_mea=`echo $cyan_mea | tr -cs "[0-9]*\n" " " | sed 's/^[ ]*//'` 
echo "$cyan_mea" 
2 147 187 

Separate die R-, G- und B-Wert

cyan_mea_r=`echo $cyan_mea | cut -d\ -f1` 
cyan_mea_g=`echo $cyan_mea | cut -d\ -f2` 
cyan_mea_b=`echo $cyan_mea | cut -d\ -f3` 

3) Berechne die Abweichungen als Prozent (bezogen auf 255)

red_pct=`convert xc: -format "%[fx:(cyan_ref_r-cyan_mea_r)/255]" info:` 
green_pct=`convert xc: -format "%[fx:(cyan_ref_g-cyan_mea_g)/255]" info:` 
blue_pct=`convert xc: -format "%[fx:(cyan_ref_b-cyan_mea_b)/255]" info:` 

4) das bild:

convert ftc_typ_sm.jpg \ 
-channel r -evaluate add $red_pct% +channel \ 
-channel g -evaluate add $green_pct% +channel \ 
-channel b -evaluate add $blue_pct% +channel \ 
ftc_typ_sm_corrected_rgb.jpg 

enter image description here

Jetzt haben Sie ein korrigiertes Bild und eine andere Farbe aus dem Diagramm oder Bild messen können.

Wenn Ihre Bilder cmyk sind, dann machen Sie das gleiche für c, m, y, k oder konvertieren Sie in RGB und machen Sie das obige.

Alternativ können Sie dies in HCL Farbraum tun:

1) Holen Sie sich das Referenz Cyanfarbe von http://xritephoto.com/documents/literature/en/ColorData-1p_EN.pdf und konvertieren zu HCL (oder HSL oder HSV usw.).

cyan_ref="srgb(8,133,161)" 
cyan_ref_hcl=`convert xc:"$cyan_ref" -colorspace HCL -format "%[pixel:u.p{0,0}]" info: | tr -cs "[0-9]*\n" " " | sed 's/^[ ]*//'` 
echo "$cyan_ref_hcl" 
191 60 39 


Separate die h, c, L-Werte

cyan_ref_h=`echo "$cyan_ref_hcl" | cut -d\ -f1` 
cyan_ref_c=`echo "$cyan_ref_hcl" | cut -d\ -f2` 
cyan_ref_l=`echo "$cyan_ref_hcl" | cut -d\ -f3` 

2) der Cyan-Swatch messen und den Mittelwert zu HCL

cyan_mea=`convert cyan_measure.png -scale 1x1! -format "%[pixel:u.p{0,0}]" info:` 
echo "$cyan_mea" 
srgb(2,147,187) 

cyan_mea_hcl=`convert xc:"$cyan_mea" -colorspace HCL -format "%[pixel:u.p{0,0}]" info: | tr -cs "[0-9]*\n" " " | sed 's/^[ ]*//'` 
echo "$cyan_mea_hcl" 
193 73 42 


Separate die h wandeln, c , l Werte

cyan_mea_h=`echo "$cyan_mea_hcl" | cut -d\ -f1` 
cyan_mea_c=`echo "$cyan_mea_hcl" | cut -d\ -f2` 
cyan_mea_l=`echo "$cyan_mea_hcl" | cut -d\ -f3` 

3) die Differenzen berechnen und

cyan_h_diff=$((cyan_ref_h-cyan_mea_h)) 
cyan_c_diff=$((cyan_ref_c-cyan_mea_c)) 
cyan_l_diff=$((cyan_ref_l-cyan_mea_l)) 
echo "cyan_h_diff=$cyan_h_diff; cyan_c_diff=$cyan_c_diff; cyan_l_diff=$cyan_l_diff;" 
cyan_h_diff=-2; cyan_c_diff=-13; cyan_l_diff=-3; 

modh=`convert xc: -format "%[fx:100+$cyan_h_diff*200/360]" info:` 
modc=$((100+cyan_c_diff)) 
modl=$((100+cyan_l_diff)) 
echo "modh=$modh; modc=$modc; modl=$modl" 
modh=98.8889; modc=87; modl=97 


4) Verarbeiten des Bildes

convert ftc_typ_sm.jpg -define modulate:colorspace=HCL -modulate $modh,$modc,$modl ftc_typ_sm_corrected_hcl.jpg 

enter image description here


auf Werte geeignet für -modulate (siehe http://www.imagemagick.org/script/command-line-options.php#modulate) ändern, Für mo re genaue Ansätze:

1) Machen Sie die RGB-Methode für alle Farbfelder und berechnen Sie die durchschnittlichen R, G, B Unterschiede.

2) Sind die HCL-Methode und berechne die durchschnittliche H, C, L Unterschiede

3) gleiche tun, aber eine Nachschlagetabelle für jede der roten, grünen und blauen (oder Farbton, Chroma, Helligkeit berechnen) Kanäle von den Paaren von Eingabe- und Ausgabewerten von jedem Farbfeld in dem Bild und der Referenztabelle.

Verwandte Themen