Wie kann ich die Farbtemperatur eines Bildes programmgesteuert anpassen?

8

Ich frage mich, wie ich programmgesteuert (dh mit einer Programmiersprache anstelle eines Editors) von einer Farbtemperatur in eine andere konvertieren kann.

Wenn ich zum Beispiel davon ausgehe (und es ist eine große Annahme), dass ein Weißabgleich-Algorithmus ein verarbeitetes Bild (z. B. JPEG usw.) aufnehmen und die Gesamttemperatur in einer Szene auf 6500 setzen könnte, wie würden Sie algorithmisch "abkühlen"? "oder" warm "die Szene auf eine bestimmte Temperatur?

Offensichtlich ist dies eine übliche Operation in einem Bildbearbeitungsprogramm, aber diese arbeiten normalerweise mit RAW-Bildern, auf die keine Verarbeitung angewendet wurde (Manipulation des Farbraums oder auf andere Weise). Bei RAW-Dateien enthalten die einzelnen RAW-Dateien möglicherweise ausreichende Informationen (im Dateikopf) zur Farbkalibrierung des Kamerasensors, um die spezifische Temperaturtransformation deterministischer zu gestalten.

Übrigens habe ich diese Frage beim regulären Stapelüberlauf gestellt und es wurde vorgeschlagen, dass ich hier eine bessere Antwort bekomme.

Trican
quelle
"[…] Vielleicht enthalten die einzelnen RAW-Dateien genügend Informationen (im Dateikopf) zur Farbkalibrierung des Kamerasensors, um die spezifische Temperaturtransformation deterministischer zu gestalten?" Ja. Das Beispiel ist für Canon Raw, daher unterscheidet sich der Standort für andere Marken etwas.
Jari Keinänen
Danke das war ein sehr nützlicher Link! Obwohl ich mir immer noch nicht sicher bin, wie ich von einer Farbtemperatur zur nächsten wechseln soll?
Trican
Rohbilder werden immer mit einem Befehlssatz interpretiert , von dem die Exif-Informationen zu den RGGB-Pegeln des Weißabgleichs ein Aspekt sind. JPGs wiederum sind mehr oder weniger zusammengesetzte Bilder, in denen alle Informationen fest codiert sind und Änderungen destruktiv sind. Ich kann keine guten Beispiele liefern, aber ich würde in ImageMagick eintauchen, einen Befehlszeilen-Bildeditor mit mehreren Programmschnittstellen. Mit dieser -color-matrixOption können Sie loslegen. siehe auch: fmwconcepts.com/imagemagick/whitebalance/index.php
Jari Keinänen
Der Typ, der auf Stapelüberlauf antwortete, antwortete richtig, aber mit weniger Details. Er schlug eine Matrix vor, die mathematisch einer Verstärkung pro Kanal entspricht, bei der die Werte außerhalb der Diagonale Null sind.
agf1997

Antworten:

6

Sie müssten eine Weißraumkonvertierung im Farbraum im L * a * b * -Raum durchführen. Die meisten Farbmodelle, mit denen wir normalerweise arbeiten, hauptsächlich RGB, aber häufig CMYK, unterstützen die Einschränkungen und Anforderungen der physischen Hardware. Diese Modelle repräsentieren den "Wahrnehmungsraum" der Farbe normalerweise nicht sehr gut, und der Weißpunkt ist definitiv ein Wahrnehmungsaspekt der Farbe.

Wann immer Sie Wahrnehmungsanpassungen an einem Bild vornehmen müssen, wie z. B. Farbtemperatur oder Farbtonverschiebungen, erfolgt dies am besten durch Konvertieren von RGB in XYZ. Während der Konvertierung können Sie "Referenzweißpunkte" für den Quell- und Zielfarbraum anwenden . Durch die Konvertierung von XYZ in Lab gelangen Sie in einen Farbraum, in dem Sie den Weißpunkt und alle Farben wahrnehmbar neu zuordnen können, sodass sie die Kontinuität aufrechterhalten.

Farbraumkonvertierungen, chromatische Anpassungen, Weißpunktanpassungen usw. sind mathematisch ziemlich komplex. Je genauer Sie wahrnehmen, desto komplexer wird die Mathematik normalerweise. Eine hervorragende Informationsquelle für Farbraumkonvertierungen finden Sie auf der Website von Bruce Lindbloom . Einige zusätzliche nützliche Informationen finden Sie auf Wikipedia . Diese Informationen finden Sie möglicherweise auch in den CIE-Leuchtmitteln der D-Serie , da sie Weißpunkt-spezifische Informationen, Berechnungen und Konstanten enthalten.

jrista
quelle
Es ist nicht erforderlich, in einen Wahrnehmungsbereich wie CIELAB zu gehen, um einen Weißabgleich für Szenenbelichtungen durchzuführen, wie sie in RAW-Kameradaten enthalten sind. Der Weißabgleich ist eine Änderung der Belichtung pro Kanal im Belichtungsraum der linearen Szene. Die chromatische Anpassung wird verwendet, um ein Bild basierend auf einem angenommenen Anpassungszustand des Betrachters an ein Leuchtmittel anzupassen. Dies geschieht ebenfalls als Gewinn, jedoch im Cone Response Space (LMS), weshalb ein vernünftiges Ergebnis erzielt wird.
agf1997
Es sollte beachtet werden, dass man von RAW cameraRGB zu XYZ und letztendlich zu CIELAB eine Charakterisierungsmatrix durchlaufen muss, die mit einem Solver optimiert wurde. Die cameraRGB-Werte müssen ordnungsgemäß weißabgeglichen sein, damit diese Matrixtransformation in XYZ genau ist und der Weißabgleich im linearen Belichtungsraum der Szene erfolgen muss.
agf1997
1
Ich wollte sagen, dass Sie das in eine Antwort einfügen sollten, aber ich sehe, dass Sie es bereits getan haben. Vielen Dank für die Einblicke! Ich wusste nicht, dass dies so einfach gemacht werden konnte.
jrista
4

Der Weißabgleich ist eine sehr einfache Manipulation der Bildverarbeitung. Es ist nur eine Verstärkung pro Kanal im linearen RGB-Raum. JPG-Dateien sind für den Weißabgleich nicht optimal, da normalerweise sowohl eine Tonkurve als auch eine elektrooptische Transformationsfunktion (EOTF) mit inversem Monitor angewendet werden, um die lineare Beziehung zu den Szenenluminanzwerten zu unterbrechen. Aus diesem Grund wird normalerweise mit RAW-Daten begonnen. Wenn Sie lineare RGB-Werte entweder über die RAW-Daten oder durch Invertieren der oben beschriebenen Nichtlinearität erhalten können, können Sie den Weißabgleich durchführen, indem Sie Folgendes anwenden.

R_out = R_in * R_gain
G_out = G_in
B_out = B_in * B_gain

Es ist üblich, keine Verstärkung auf den grünen Kanal anzuwenden, da dies sehr grob mit der Luminanz zusammenhängt und das Ändern aller drei Kanäle auch die Gesamtbelichtung verschieben würde.

In den RAW-Dateien befindet sich normalerweise ein Metadatenfeld, das eine Reihe von Weißabgleichverstärkungen enthält, die von der Kamera mithilfe eines integrierten Algorithmus berechnet werden. Diese Algorithmen basieren normalerweise auf irgendeiner Form eines Schätzalgorithmus für Farbkonstanz-Leuchtmittel.

Sobald die Verstärkungen auf eine codierende Primärmatrix angewendet wurden, sollten die Zieltonwiedergabekurve und der inverse EOTF angewendet werden.

agf1997
quelle
Ich bin gespannt, wie man einen Weißabgleich wie bei Lightroom durchführen kann, wo man sowohl eine Farbtemperatur als auch einen Farbton hat. Diese beiden Schieberegler passen perfekt zu den beiden planaren Lab-Raumachsen sowie zur CIE-basierten Weißpunktanpassungsformel, die online verfügbar ist. Ist es möglich, Farbtemperatur und Farbton mit dieser Einfachheit getrennt zu steuern? Ist das nur eine andere Berechnung, um R_gain und B_gain zu bestimmen?
jrista
@jrista Die Farbtemperatur- und Farbtonwerte werden verwendet, um eine Farbart zu definieren. Diese Farbart wird wieder in einen Satz von R-, G- und B-Verstärkungsfaktoren umgewandelt, die für den Weißabgleich im Belichtungsraum der Szene verwendet werden.
agf1997
2

Ich hatte ein großartiges Bild von einer Frau, die ich unter seltsamen, komplexen Lichtverhältnissen (Natriumdampf- und Quecksilberdampflichter) aufgenommen habe. Tolles Lächeln, perfekter Fokus, exzellentes Bild, bis auf die Farbe.

Ich habe eine Stunde lang mit Temp / Tint in Adobe Camera Raw gespielt, ohne ein gutes Ergebnis zu erzielen. Ich habe ein Programm geschrieben, um die XMP-Datei des Beiwagens zu hacken, indem ich die Temperatur variiere und dann einen symbolischen Link zum ursprünglichen NEF herstelle, der parallel zur XMP-Datei benannt ist.

Dies ist NICHT annähernd so ausgefallen und technisch nicht korrekt wie die obige Antwort, sondern wirft eine enorme Menge an CPU auf das Problem und liefert einige (möglicherweise) interessante Ergebnisse.

Dadurch werden eine Reihe von .NEF-Dateilinks und jeweils eine echte .XMP-Sidecar-Datei erstellt. Kopieren Sie einfach eine echte nef / xmp-Dateikombination, um sie in das Testverzeichnis zu klonen, und stellen Sie die min / max-Temperatur und dif_temp (Kelvin zwischen Klonen) ein. Eine weitere Schleife kann eingefügt werden, um den Farbtonwert bei einem konstanten Kelvin zu variieren. Die generierten Dateien werden jedoch mit der Anzahl der Farbtöne multipliziert.

Führen Sie die Photoshop-Datei -> Skripte -> Bildprozessor aus, zeigen Sie auf dieses Verzeichnis, und es wird für jeden Link bei der angegebenen Farbtemperatur ein echtes tif / jpg / was auch immer erstellt.

Dieser Code ist ein schmutziger, hässlicher Hack, und wenn er ausgeführt wird, schmilzt er wahrscheinlich Ihren Prozessor und zieht Kugelblitze und Killerbienen in die unmittelbare Umgebung. Keine Garantie ist selbstverständlich.

Benötigt Perl (wird sicherlich täglich verwendet) und mklink (kann vorhanden sein).

sub color_temp_experiment()  {
$nef = '6s-2014.1004-237695.acl.nef'; 
$xmp = '6s-2014.1004-237695.acl.xmp';  # crs:Temperature="6000"
$min_temp = 7800;
$max_temp = 9000;
$dif_temp = 200;   # Difference in temp per loop.
$xd = `cat $xmp`;  # Xmp Data;
($base = $nef) =~ s/\.nef//;  # Basename common to both nef and xmp.
$ii = -1;
for($temp = $min_temp; $temp <= $max_temp; $temp += $dif_temp)  {
    $ii++;
    $link = $base . ".$temp" . 'k.nef';  # Abuse Kelvins with lower case.
    $xfn  = $base . ".$temp" . 'k.xmp';  # Abuse Kelvins with lower case.
    if(-f $link)  {
        print("Found FILE (s/b sym link!) $link. Next!\n");  # This prints!
        next;
    }
    $cmd = "mklink $link $nef";
    printf("$ii) Cmd = $cmd\n");
    $sto = `$cmd`;
    unless(-f $link)  {
        print("ERROR! Sym link $link not found!\n StdOut=<<$sto>>\n\n");
        exit;
    }
    ($xt = $xd) =~ s/crs:Temperature="\d+/crs:Temperature="$temp/ms;
    open(O, ">$xfn");
    print(O "$xt");
    close O;
}

}}

BrianP007
quelle