
Wenn Sie die Farbtemperatur nicht kennen,
beginnen Sie hier .
Während ich am
Farbtemperatur- Tool für
PhotoDemon arbeitete , habe ich den ganzen Abend versucht, einen einfachen und klaren Algorithmus für die Konvertierung zwischen Temperaturwerten (in Kelvin) und RGB zu ermitteln. Ich dachte, ein solcher Algorithmus wäre leicht zu finden, da viele Bildbearbeitungsprogramme über Tools zum Korrigieren der Farbtemperatur verfügen und in jeder modernen Kamera, einschließlich Smartphones, ein Weißabgleich basierend auf den Lichtverhältnissen vorgenommen wird.
Ein Beispiel für einen Kamerabildschirm mit Weißabgleich. QuelleEs stellte sich heraus, dass es fast unmöglich ist, eine zuverlässige Formel für die Umwandlung der Temperatur in RGB zu finden. Natürlich gibt es einige Algorithmen, aber die meisten von ihnen konvertieren die Temperatur in den XYZ-Farbraum, zu dem Sie dann die RGB-Transformation hinzufügen können. Solche Algorithmen scheinen auf der Robertson-Methode zu basieren, von der eine Implementierung
hier und die andere
hier ist .
Leider liefert dieser Ansatz keine rein mathematische Formel - es handelt sich lediglich um eine Interpolation gemäß der Umrechnungstabelle. Dies mag unter bestimmten Umständen sinnvoll sein, aber wenn Sie die zusätzliche Konvertierung XYZ → RGB berücksichtigen, ist sie für eine einfache Einstellung der Farbtemperatur in Echtzeit zu langsam.
Also habe ich meinen eigenen Algorithmus geschrieben und er funktioniert verdammt gut. So habe ich es bekommen.
Warnungen bezüglich dieses Algorithmus
Warnung 1 : Mein Algorithmus bietet eine qualitativ hochwertige Annäherung, ist jedoch für eine ernsthafte wissenschaftliche Verwendung nicht genau genug. Es ist in erster Linie zur Manipulation von Fotos gedacht. Versuchen Sie daher nicht, es für die Astronomie oder in der Medizin zu verwenden.
Warnung 2 : Aufgrund seiner relativen Einfachheit ist dieser Algorithmus schnell genug, um in Echtzeit mit Bildern einer angemessenen Größe zu arbeiten (ich habe ihn an 12-Megapixel-Bildern getestet). Verwenden Sie jedoch für optimale Ergebnisse mathematische Optimierungen, die für Ihre Programmiersprache spezifisch sind. Ich zeige den Algorithmus ohne mathematische Optimierungen, um ihn nicht zu komplizieren.
Warnung 3 : Der Algorithmus kann nur im Bereich von 1000 K bis 40.000 K verwendet werden. Dies ist ein guter Bereich für die Fotografie. (Tatsächlich ist es viel größer als in den meisten Situationen erforderlich). Obwohl es für Temperaturen außerhalb dieses Bereichs funktioniert, nimmt die Qualität ab.
Besonderer Dank geht an Mitchell Charity
Erstens muss ich eine Menge Schulden bezahlen und Mitchell Charity für die ersten Daten danken, die ich zur Erstellung dieser Algorithmen verwendet habe: eine
unverarbeitete Black-Body-Datei . Charity stellt zwei Datensätze zur Verfügung, und mein Algorithmus verwendet die
10-Grad-Farbanpassungsfunktion von CIE 1964 . Eine Diskussion der 2-Grad-CIE 1931-Funktion mit den Korrekturen von Judd Wos im Vergleich zum 10-Grad-Satz würde den Rahmen dieses Artikels sprengen. Wenn Sie jedoch interessiert sind, können Sie auf
dieser Seite eine umfassende Analyse starten.
Algorithmus: Beispielausgabe
Hier ist die Ausgabe des Algorithmus im Bereich von 1000 K bis 40.000 K:
Die Ausgabe meines Algorithmus liegt zwischen 1000 K und 40.000 K. Der Weißpunkt liegt zwischen 6500 und 6600 K, was ideal für die Verarbeitung von Fotos auf einem modernen LCD-Monitor istHier ist eine detailliertere Momentaufnahme des Algorithmus in einem interessanten Bereich für die Fotografie von 1500 K bis 15000 K:
Der gleiche Algorithmus, jedoch von 1500 K bis 15000 K.Wie Sie sehen können, ist die Streifenbildung minimal, was eine große Verbesserung gegenüber den oben genannten übereinstimmenden Tabellen darstellt. Der Algorithmus bewahrt auch hervorragend einen hellgelben Farbton in der Nähe des weißen Punkts, was für die Simulation des Tageslichts bei der Nachbearbeitung von Fotos wichtig ist.
Wie ich zu diesem Algorithmus gekommen bin
Der erste Schritt zur Ableitung einer zuverlässigen Formel bestand darin, die
ursprünglichen Werte des schwarzen Körpers von Charity zu zeichnen. Sie können die
gesamte Tabelle im LibreOffice / OpenOffice .ods-Format (430 KB) herunterladen.
Hier sind die Daten nach dem Plotten:
Originaltemperaturdaten (K) in RGB (sRGB), LibreOffice Calc-Diagramm. Auch hier basiert die Konvertierung auf der 10-Grad-CMF-Funktion von CIE 1964. Der Weißpunkt liegt je nach Bedarf zwischen 6500 K und 6600 K (Peak auf der linken Seite des Diagramms). QuelleEs ist leicht zu bemerken, dass es mehrere Abschnitte gibt, die unseren Algorithmus vereinfachen. Insbesondere:
- Rotwerte unter 6600 K sind immer 255
- Blauwerte unter 2000 K sind immer 0
- Blauwerte über 6500 K betragen immer 255
Es ist auch wichtig zu beachten, dass Grün am besten als zwei separate Kurven betrachtet wird, um die Kurve an die Daten anzupassen - eine für Temperaturen unter 6600 K und die andere für Temperaturen über diesem Punkt.
Von diesem Moment an habe ich die Daten (ohne die Segmente "immer 0" und "immer 255") in separate Farbkomponenten unterteilt. In einer idealen Welt kann die Kurve an jeden Punktesatz angepasst werden, aber in Wirklichkeit ist dies leider nicht so einfach. Da es eine starke Diskrepanz zwischen den Werten von X und Y in der Grafik gibt - alle x-Werte sind größer als 1000 und werden in 100 Punktsegmenten angezeigt, während die y-Werte zwischen 255 und 0 liegen - musste ich die x-Daten transponieren, um die beste Anpassung zu erhalten. Zu Optimierungszwecken habe ich zuerst den x-Wert (Temperaturwert) für jede Farbe durch 100 geteilt und dann abgezogen, wie viel ich brauchte, wenn dies bei der Anpassung an das Diagramm sehr hilfreich war. Hier sind die resultierenden Diagramme für jede Kurve sowie die am besten geeignete Kurve und der entsprechende Wert des Bestimmungskoeffizienten (R-Quadrat):




Ich entschuldige mich für das schreckliche Kerning von Schriftarten und Hinweise auf Diagramme. LibreOffice hat viele Vorteile, aber die Unfähigkeit, Schriftarten in Diagrammen zu glätten, ist völlig beschämend. Ich mag es auch nicht, Diagramme aus Screenshots zu extrahieren, da sie keine Exportoption haben, aber es ist besser, sie für später zu belassen.
Wie Sie sehen können, sind alle Kurven ziemlich gut ausgerichtet, wobei die Werte des Bestimmungskoeffizienten über 0,987 liegen. Ich könnte mehr Zeit damit verbringen, die Kurven anzupassen, aber das reicht für die Verarbeitung von Fotos. Kein einziger Einwohner wird sagen, dass die Kurven nicht genau den anfänglichen idealisierten Beobachtungen des schwarzen Körpers entsprechen, oder?
Algorithmus
Hier ist der Algorithmus in seiner ganzen Pracht.
Erstens Pseudocode:
- 1000 40000. ( , 40000 K). , . Set Temperature = Temperature \ 100 : If Temperature <= 66 Then Red = 255 Else Red = Temperature - 60 Red = 329.698727446 * (Red ^ -0.1332047592) If Red < 0 Then Red = 0 If Red > 255 Then Red = 255 End If : If Temperature <= 66 Then Green = Temperature Green = 99.4708025861 * Ln(Green) - 161.1195681661 If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 Else Green = Temperature - 60 Green = 288.1221695283 * (Green ^ -0.0755148492) If Green < 0 Then Green = 0 If Green > 255 Then Green = 255 End If : If Temperature >= 66 Then Blue = 255 Else If Temperature <= 19 Then Blue = 0 Else Blue = Temperature - 10 Blue = 138.5177312231 * Ln(Blue) - 305.0447927307 If Blue < 0 Then Blue = 0 If Blue > 255 Then Blue = 255 End If End If
Beachten Sie, dass im obigen Pseudocode
Ln () den natürlichen Logarithmus bedeutet . Beachten Sie auch, dass Sie die Überprüfung weglassen können, wenn die Farbe kleiner als 0 ist, wenn die Temperatur immer im empfohlenen Bereich liegt. (Sie müssen jedoch noch das Häkchen "Wenn die Farbe größer als 255 ist" lassen.)
In Bezug auf den tatsächlichen Code ist hier die genaue Visual Basic-Funktion, die ich in
PhotoDemon verwende . Es wurde noch nicht optimiert (zum Beispiel sind Logarithmen mit Korrespondenztabellen viel schneller), aber zumindest der Code ist präzise und lesbar:
Die Funktion wurde verwendet, um die Beispielausgabe am Anfang dieses Artikels zu generieren, sodass ich garantieren kann, dass sie funktioniert.
Beispielbilder
Hier ist ein großartiges Beispiel dafür, wie Farbtemperaturanpassungen durchgeführt werden können. Das Bild unten - ein Werbeplakat für True Blood von HBO - zeigt auf spektakuläre Weise das Potenzial zur Anpassung der Farbtemperatur. Links ist der Originalrahmen; rechts - Stellen Sie die Farbtemperatur mit dem obigen Code ein. Mit einem Klick kann die Nachtszene für Tageslicht neu erstellt werden.
Farbtemperatureinstellung in AktionDas echte Farbtemperatur-Tool in meinem PhotoDemon-Programm lautet wie folgt:
PhotoDemon Farbtemperatur-ToolLaden Sie das Programm
herunter und sehen Sie es in Aktion.
Update Oktober 2014
Renault Bedar hat eine großartige
Online-Demo für diesen Algorithmus erstellt. Danke Renault!
Update April 2015
Vielen Dank an alle, die Verbesserungen des ursprünglichen Algorithmus vorgeschlagen haben. Ich weiß, dass der Artikel viele Kommentare enthält, aber sie sind lesenswert, wenn Sie vorhaben, Ihre eigene Version zu implementieren.
Ich möchte zwei spezifische Verbesserungen hervorheben. Zunächst stellte Neil B freundlicherweise die beste Version für die ursprünglichen Kurvenanpassungsfunktionen zur Verfügung, wodurch sich die Temperaturkoeffizienten geringfügig ändern. Die Änderungen werden in
seinem ausgezeichneten Artikel ausführlich
beschrieben .
Dann fügte Francis Loch einige Kommentare und Beispiele von Bildern hinzu, die sehr nützlich sind, wenn Sie diese Transformationen auf Fotos anwenden möchten. Seine Modifikationen ergeben ein viel detaillierteres Bild,
wie in den Beispielen gezeigt .