Wie kann ich die Farbtemperatur eines Bildes programmgesteuert anpassen?

Ich frage mich, wie ich programmgesteuert (dh mit einer Programmiersprache und nicht mit einem Editor) von einer Farbtemperatur in eine andere konvertieren kann.

Wenn ich zum Beispiel die Annahme (und es ist eine große Annahme), dass ein Weißabgleichsalgorithmus ein verarbeitetes Bild (z. B. JPEG usw.) aufnehmen und die Gesamttemperatur in einer Szene bei 6500 platzieren könnte, wie würden Sie algorithmisch "cool" cool " " oder die Szene auf eine bestimmte Temperatur "erwärmen"?

Offensichtlich ist dies eine übliche Operation in einem Bildbearbeitungsprogramm, aber diese arbeiten normalerweise mit RAW-Bildern, auf die keine Verarbeitung angewendet wurde (Farbraummanipulation oder auf andere Weise). Im Fall von RAW-Dateien enthalten vielleicht die einzelnen RAW-Dateien genügend Informationen (im Dateikopf) bezüglich der Farbkalibrierung des Kamerasensors, um die spezifische Temperaturtransformation deterministischer zu machen?

Übrigens habe ich diese Frage im regulären Stack Overflow gestellt und es wurde vorgeschlagen, dass ich hier eine bessere Antwort bekomme.

„[…] vielleicht enthalten die einzelnen RAW-Dateien genügend Informationen (im Dateikopf) bezüglich der Farbkalibrierung des Kamerasensors, um die spezifische Temperaturtransformation deterministischer zu machen?“ Ja. Das Beispiel gilt für Raw von Canon, daher weicht die Position für andere Marken etwas ab.
Danke das war ein sehr hilfreicher Link! Obwohl ich immer noch unsicher bin, wie ich von einer Farbtemperatur zu einer anderen wechseln soll?
RAW-Bilder werden immer mit einem Befehlssatz interpretiert , von dem die Exif-Informationen zu Weißabgleich-RGGB-Stufen ein Aspekt sind. JPGs wiederum sind mehr oder weniger zusammengesetzte Bilder, in denen alle Informationen fest codiert sind und Bearbeitungen destruktiv sind. Ich kann keine guten Beispiele liefern, aber ich würde in ImageMagick eintauchen , einen Befehlszeilen-Bildeditor mit mehreren Programmschnittstellen. Seine -color-matrixOption könnte Ihnen den Einstieg erleichtern; siehe auch: fmwconcepts.com/imagemagick/whitebalance/index.php
Der Typ, der auf den Stapelüberlauf geantwortet hat, hat richtig geantwortet, aber mit weniger Details. Er schlug eine Matrix vor, die mathematisch äquivalent zu einer Pro-Kanal-Verstärkung der außerdiagonalen Werte gleich Null ist.

Antworten (3)

Sie müssten eine Farbraum-Weißpunktkonvertierung im L*a*b*-Raum durchführen. Die meisten Farbmodelle, mit denen wir normalerweise arbeiten, hauptsächlich RGB, aber oft CMYK, sind so konzipiert, dass sie die Einschränkungen und Anforderungen physischer Hardware unterstützen. Diese Modelle stellen den "wahrnehmungsbezogenen" Farbraum jedoch normalerweise nicht sehr gut dar, und der Weißpunkt ist definitiv ein wahrnehmungsbezogener Aspekt der Farbe.

Wann immer Sie Wahrnehmungsanpassungen auf ein Bild anwenden müssen, wie z. B. Farbtemperatur oder Farbtonverschiebungen, tun Sie dies am besten durch Konvertieren von RGB in XYZ, und während der Konvertierung können Sie „Referenz-Weißpunkte“ für den Quell- und Zielfarbraum anwenden . Die Konvertierung von XYZ zu Lab bringt Sie dann in einen Farbraum, in dem Sie den Weißpunkt und alle Farben per Wahrnehmung so neu zuordnen können, dass sie die Kontinuität beibehalten.

Farbraumkonvertierungen, chromatische Anpassungen, Weißpunktanpassungen usw. sind mathematisch ziemlich komplex. Je wahrnehmungsgenauer Sie vorgehen möchten, 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 . Möglicherweise finden Sie diese Informationen zu CIEs D-Serie-Beleuchtungsstörungen nützlich, da sie weiße Punktspezifische Informationen, Berechnungen und Konstanten enthält.

Es ist nicht erforderlich, in einen Wahrnehmungsraum wie Cielab zu gelangen, um einen Weißabgleich für Szenenexpositionen wie die in Rohkamerataten zu finden. Der Weißabgleich ist eine Belichtungsänderung pro Kanal im linearen Szenenbelichtungsraum. Die chromatische Anpassung wird verwendet, um ein Bild basierend auf einem angenommenen Anpassungszustand des Betrachters an eine Lichtquelle anzupassen. Dies erfolgt ebenfalls als Verstärkung, jedoch im Cone Response Space (LMS), weshalb es zu einem vernünftigen Ergebnis führt.
Es sollte beachtet werden, dass man, um von RAW cameraRGB zu XYZ und schließlich CIELAB zu gelangen, eine Charakterisierungsmatrix durchlaufen muss, die mit einem Solver optimiert wurde. Die RGB-Werte der Kamera müssen richtig weißabgeglichen sein, damit diese Matrixtransformation in XYZ genau ist, was effektiv erfordert, dass der Weißabgleich in einem linearen Szenenbelichtungsraum durchgeführt wird.
Ich wollte sagen, dass Sie das in eine Antwort aufnehmen sollten, aber ich sehe, Sie haben es bereits getan. Danke aber für die Einblicke! Ich war mir nicht bewusst, dass dies so einfach gemacht werden kann.

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 suboptimal, da sie normalerweise sowohl eine Tonwertkurve als auch eine inverse elektrooptische Monitor-Transformationsfunktion (EOTF) haben, die die lineare Beziehung zu den Luminanzwerten der Szene aufhebt. Aus diesem Grund wird normalerweise mit RAW-Daten begonnen. Wenn Sie entweder über die RAW-Daten oder durch Invertieren der oben beschriebenen Nichtlinearität zu linearen RGB-Werten gelangen, 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

Beachten Sie, dass es üblich ist, keine Verstärkung auf den grünen Kanal anzuwenden, da er sehr grob mit der Luminanz zusammenhängt und eine Änderung aller drei Kanäle auch die Gesamtbelichtung verschieben würde.

In den RAW-Dateien gibt es normalerweise ein Metadatenfeld, das eine Reihe von Weißabgleichsverstärkungen enthält, die von der Kamera mithilfe eines integrierten Algorithmus berechnet werden. Diese Algorithmen basieren normalerweise auf einer Art Farbkonstanz-Beleuchtungsart-Schätzalgorithmus.

Sobald die Verstärkungen angewendet werden, sollten eine primäre Kodiermatrix, die Zieltonwiedergabekurve und der inverse EOTF angewendet werden.

Ich bin gespannt, wie man einen Weißabgleich durchführen kann, wie es mit Lightroom gemacht wird, wo man sowohl eine Farbtemperatur als auch einen Farbton hat. Diese beiden Schieberegler stimmen perfekt mit den beiden planaren Lab-Raumachsen sowie mit der CIE-basierten Weißpunkt-Anpassungsformel überein, die online zu finden ist. Ist es möglich, Farbtemperatur und Farbton mit dieser Art von Einfachheit separat zu steuern? Ist das nur eine andere Berechnung zur Bestimmung von R_gain und B_gain?
@jrista Die Farbtemperatur- und Farbtonwerte werden verwendet, um eine Farbart zu definieren. Diese Chromatizität wird zurück in einen Satz von R-, G- und B-Verstärkungsfaktoren umgewandelt, die für den Weißabgleich im Szenenbelichtungsraum verwendet werden.

Ich hatte ein großartiges Bild von einer Frau, das ich unter seltsamer, komplexer Beleuchtung (Natriumdampf- und Quecksilberdampflicht) aufgenommen hatte. Tolles Lächeln, perfekte Fokussierung, exzellentes Bild, abgesehen von einer sehr, sehr farblichen Abweichung.

Ich habe eine Stunde lang in Adobe Camera Raw mit Temp/Tint herumgespielt, ohne gutes Ergebnis. Ich habe ein Programm geschrieben, um die Sidecar-XMP-Datei zu hacken, die Temperatur zu variieren und dann einen symbolischen Link zum ursprünglichen NEF mit dem Namen parallel zur XMP-Datei zu erstellen.

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

Dadurch werden eine Reihe von .NEF-Dateiverknüpfungen und für jede eine echte .XMP-Sidecar-Datei erstellt. Kopieren Sie einfach eine echte nef/xmp-Datei-Kombination zum Klonen in das Testverzeichnis und legen Sie die min/max-Temp und dif_temp (Kelvin zwischen Klonen) fest. Eine weitere Schleife kann eingefügt werden, um den Farbtonwert bei einem konstanten Kelvin zu variieren, aber die erzeugten Dateien werden mit der Anzahl der Farbtöne multipliziert.

Führen Sie Photoshop file -> scripts -> image_processor aus, verweisen Sie auf dieses Verzeichnis und es wird ein echtes tif/jpg/whatever für jeden Link bei der angegebenen Farbtemperatur erstellt.

Dieser Code ist ein schmutziger, hässlicher Hack, und wenn Sie ihn ausführen, wird Ihr Prozessor wahrscheinlich schmelzen, während Kugelblitze und Killerbienen in die unmittelbare Umgebung gelockt werden. Keine Garantie versteht sich von selbst.

Erfordert Perl (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;
}

}