Die UniWB-Einstellung, Teil 3

Einleitung

In den Teilen 1 und 2 habe ich beschrieben, wie man für eine Digitalkamera auf relativ einfache Weise den UniWB-Abgleich machen kann. Im Ergebnis werden die Sensorwerte der drei Farbkanäle beim Weißabgleich nicht mehr mit unterschiedlichen Faktoren multipliziert, so dass beim Weißabgleich keine Verzerrung des Histogramms erzeugt wird. Jedoch ist das angezeigte Histogramm immer noch ein aus dem jpeg-Vorschaubild berechnetes Histogramm, d.h. es enthält immer noch Verzerrungen aufgrund der Signalverarbeitung der kamerainternen jpeg-Berechnungssoftware, z.B. durch die angewendete Tonkurve zum Kontrast- und Helligkeitsausgleich. Und es ist ein 8-Bit-Histogramm! Der höhere Dynamikumfang des RAW-Bildes (mehr als 12 Bit, je nach Kameramodell) kann in dem angezeigten Histogramm ohne weitere Manipulationen nicht dargestellt werden. Die Möglichkeiten, hier Abhilfe zu schaffen, hängen stark vom jeweiligen Kameramodell ab. Ich beschreibe im Folgenden, wie ich bei meiner Fujifilm X-T20 dabei vorgegangen bin.

Testaufnahmen

Für die weitere Untersuchung der Kameraeigenschaften habe ich eine Belichtungsreihe für die Fotografie einer weißen Wand bei Tageslicht im RAW-Format mit eingeschaltetem UniWB-Abgleich aufgenommen, bei jedem Bild das RGB-Histogramm auf dem Kameradisplay eingeschaltet und mit einem Smartphone zum Vergleich abfotografiert. Die Belichtungsreihe beginnt bei -3 EV und endet bei +3 EV, die Schrittweite beträgt 1/3 EV. Die RAW-Daten habe ich mit dem Programm RawDigger ausgewertet. Mit diesem Programm kann man das RAW-Histogramm auswerten und darstellen. Dabei habe ich zunächst nur einen kleinen Bereich der Fotos jeweils in der Bildmitte ausgewertet, damit die Helligkeitsverteilung auf der Wand und die Vignettierung des Objektivs keinen großen Einfluss auf das Histogramm haben. Die Abbildung 1 zeigt das RAW-Histogramm für 0 EV. Dabei ist das Histogramm so angepasst, dass der Grüne Kanal den Wert 0 EV erhält.

Abbildung 1: Beispielhistogramm für 0 EV

Trägt man nun die zu den jeweiligen RAW-Fotos gehörenden Sensor-Ausgaben (ADC) der drei Kanäle über den an der Kamera eingestellten Belichtungswerten in einem Diagramm auf, erhält man die folgenden Darstellungen, wobei die Abbildung 2 die Sensorwerte im linearen Maßstab und die Abbildung 3 im logarithmischen Maßstab zeigt.

Abbildung 2: Sensorwerte in Abhängigkeit von der Belichtung

Abbildung 3: Sensorwerte in Abhängigkeit von der Belichtung

Wie erwartet zeigt sich in der logarithmischen Darstellung ein streng linearer Zusammenhang, wobei bei einem Sensorwert von 15360 Sättigung eintritt. Dabei beträgt die Belichtung für den grünen Kanal 3,3 EV, für den roten Kanal 4,5 EV und für den blauen Kanal 4,3 EV.

Das Kamera-Histogramm

Das Kamera-Histogramm enthält die Daten aller Sensorpunkte. Aufgrund der Helligkeitsverteilung auf der fotografierten Wand, der Vignettierung des Objektivs und des intern in der Kamera gewählten Maßstabs der Häufigkeiten ergeben sich im Kamera-Histogramm keine schmalen Peaks sondern mehr säulenförmige Bereiche, d.h. der intern gewählte Maßstab der Häufigkeiten ist für Motive mit räumlich konstanter Helligkeit, wie eine weiße Wand, nicht gut geeignet, weil er die hohen Häufigkeiten nicht darstellen kann. Die folgende Abbildung 4 zeigt das Kamerahistogramm für die Aufnahme mit 0 EV Belichtung. Aufgrund der UniWB-Einstellung wird die weiße Wand im Kameradisplay grün dargestellt.

Abbildung 4: Kamerahistogramm für 0 EV Belichtung und UniWB

Andererseits ist zu erkennen, dass die UniWB Einstellung die Relation der drei Farbkanäle richtig wiedergibt (siehe zum Vergleich Abbildung 1).

Bei automatischem Weißabgleich mit der Kamera erhält man eine Histogrammdarstellung auf grauem Hintergrund mit praktisch gleich positionierten Histogrammen in allen Kanälen, wie die folgende Abbildung 5 zeigt. Der Bildhintergrund ist aufgrund der Kalibrierung der Belichtungsmessung in der Kamera entsprechend der eingestellten Belichtung mit 0 EV grau eingefärbt.

Abbildung 5: Kamerahistogramm für 0 EV Belichtung und automatischem Weißabgleich

(Die Belichtungszeiten der Fotos zu den Abbildungen 4 und 5 unterscheiden sich etwas, weil die Beleuchtungsbedingungen bei den Aufnahmen unterschiedlich sind.)

Im hier vorliegenden Fall einer weißen Wand erhält man im grünen Kanal deutlich höhere Sensorwerte als im roten und blauen Kanal, wie die RAW-Histogramme in den Abbildungen 1 und 4 zeigen. Bei automatischem Weißabgleich geht dieser Unterschied der Farbkanäle im Histogramm verloren, weil es aus dem bearbeiteten jpeg-Bild ermittelt wird. Außerdem sind die „Säulen“ deutlich nach rechts gerückt und suggerieren höhere Belichtungswerte und damit höhere Sensorwerte. Oder anders ausgedrückt, man wird aufgrund dieses Histogramms zu knapp belichten, wenn man den Belichtungsspielraum des Sensors voll nutzen möchte. Verläßt man sich bei der Belichtung auf ein solches Histogramm, kann es außerdem passieren, dass je nach Farbverteilung des Motivs bereits ein Farbkanal in den Sättigungsbereich kommt ohne dass dies angezeigt wird. Alles Gründe für das Fotografieren im RAW-Format mit UniWB -Einstellung, solange die Kamerahersteller kein RAW-Histogramm in die Kamerasoftware integrieren.

Justieren des Kamera-UniWB-Histogramms

Für die Bewertung der gewählten Belichtung, ist es wünschenswert, im Histogramm die Sättigungspunkte des Sensors in den drei Farbkanälen zu erkennen. Weil das aus dem jpeg-Vorschaubild gewonnene Histogramm trotz der UniWB-Einstellung nur 8 Bit des je nach Kameratyp 12 Bit bis 16 Bit umfassenden RAW-Bildes auflöst, ergibt sich hier ein weiteres Problem. Abhilfe ist hier nur möglich, indem die jpeg-Verarbeitung in der Kamera dazu veranlasst wird, die Transformation der Lichter des RAW-Bildes so zu verändern, dass eine entsprechende Anpassung am rechten Ende des Histogramms erfolgt. Bei den Fujifilm X-T Kameras kann diese Anpassung über die Funktion „TON LICHTER“ vorgenommen werden. Hier lassen sich Werte im Bereich von -2, -1, …, +4 auswählen, welche die Tonkurve im Bereich der Lichter verändern, d.h. den Kontrast erhöhen oder vermindern. Ich habe für die Darstellung dieses Einflusses auch eine entsprechende Belichtungsreihe aufgenommen. Bei praktisch unverändertem RAW-Histogramm ergibt sich mit zunehmendem Wert der TON-LICHTER-Einstellung eine Verschiebung des Kamerahistogramms zum rechten Rand und darüber hinaus. Es zeigt sich, dass eine Einstellung von -2 das Problem fast löst. Die Wahl eines Filmprofils mit flachem Farbkontrast, wie PRO.Neg.Std., unterstützt dies noch einmal. Bei einer Belichtung mit 3 EV und der Einstellung TON LICHTER von -2 überschreitet das Histogramm nur leicht den rechten Rand (hier der grüne Kanal) und es bleibt noch eine Reserve von ca. 1/3 EV bis zur Sättigung, wie die folgenden Abbildungen zeigen. Die folgende Abbildung 6 zeigt das RAW-Histogramm aus dem Programm RawDigger für das gesamte RAW-Bild (nicht nur für das Zentrum, wie Abbildung 1). Der grüne Kanal erreicht einen Sensorwert von 15183 im Vergleich zum Sättigungswert von 15360 bei meiner Kamera.

Abbildung 6: RAW-Histogramm für +3 EV

Abbildung 7: Kamerahistogramm mit UniWB und TON LICHTER = -2 bei +3 EV

Zusammenfassung

Für die Beurteilung der Belichtung von RAW-Aufnahmen ist eine UniWB-Einstellung des Weißabgleichs hilfreich. Weiterhin ist eine Justage des Kamerahistogramms hinsichtlich eines minimalen Abstandes zwischen dem rechten Rand und dem Sättigungspunkt des Sensors günstig. Für Fujifilm X-T Kameras kann hierzu die Funktion TON LICHTER verwendet werden, wobei sich bei meiner Kamera die Einstellung auf den Wert -2 und auf eine Filmsimulation mit PRO.Neg.Std. als optimal erwies.

Die UniWB-Einstellung, Teil2

Einleitung

Im Folgenden wird die Begründung des im Teil 1 beschriebenen iterativen Verfahrens dargestellt.

Modell

Für die weitere Darstellung wird in guter Näherung davon ausgegangen, dass der Sensor linear arbeitet, d.h. dass sein Ausgangssignal der gesammelten Lichtmenge und damit der „Helligkeit“ des fotografierten Objekts, in unserem Fall das Monitorbild, proportional ist und dies für jeden Pixel in gleicher Weise gilt. In diesem Fall kann der Zusammenhang zwischen dem Sensor-Ausgangssignal für jedes Pixel (RAW-Bild) und der Objekthelligkeit bei einer festen Belichtungseinstellung (Belichtungszeit, Blende, ISO-Wert) wie folgt dargestellt werden:

\vec{F} = \{C\} \cdot \vec{H} + \vec{B}.

Dabei sind
\vec{F} der Vektor mit den Sensordaten  für die drei RGB-Farbkanäle
F_r, F_g und F_b,
\{C\} die Transformationsmatrix,
\vec{H} der Vektor mit den Helligkeiten der drei Grundfarben des Monitors und
\vec{B} der Vektor mit den Schwarzwerten des Sensors, d.h. den Sensorausgaben bei schwarzem Monitorbild.
Die Komponenten des Vectors \vec{H} ergeben sich aus dem Vektor \vec{S} mit den normierten RGB-Werten (R/255, G/255, B/255) für die Ansteuerung
des Monitors und seinem \gamma -Wert mit:
\vec{H} = \vec{S}^{\frac{1}{\gamma}}.

Manueller Weißabgleich

Beim manuellen Weißabgleich ermittelt die Kamerasoftware eine  Korrekturmatrix

\{W\} = Diag(K_r, 1.0, K_b) ,

so dass gilt:

\vec{G} = \{W\} \cdot \vec{F} = \{W\} \cdot(\{C\}\cdot \vec{H} + \vec{B}).

Dabei enthält der Grauwert-Vektor \vec{G} identische Werte in seinen Komponenten.

UniWB-Einstellung

Um eine UniWB-Einstellung zu erreichen, muss somit ein solcher Helligkeitsvektor \vec{H_W} auf dem Monitor dargestellt werden, dass die Kamerasoftware für \vec{W} die Einheitsmatrix \{E\}= Diag(1.0, 1.0, 1.0) ermittelt. Dieser Helligkeitsvektor lässt sich bei bekannter Transformationsmatrix und bekanntem Schwarzwertvektor aus einem vorgegebenen Grauwert gemäß den obigen Gleichungen ermitteln:

\vec{H_W}=\{C\}^{-1}\cdot(\vec{G}-\vec{B})

Die Ermittlung der Transformationsmatrix, des Schwarzwertvektors und des Gammawertes des Monitors ist mit einem entsprechend gestalteten Testbild und der Anwendung von Parameterschätzverfahren auf das RAW-Abbilds dieses Testbilds möglich. Und mit der obigen Gleichung lassen sich dann die Helligkeitswerte und die RGB-Signalwerte zur Ansteuerung des Monitors für ein Testbild zum manuellen Weißabgleich ermitteln. Ich habe dieses Verfahren auch erprobt, es funktioniert, ist aber sehr aufwändig und wenig praktikabel. Ich habe auch im Internet eine etwas abgespeckte Version gefunden, die mit nur drei Testfarben auskommt und die Schwarzwerte nicht berücksichtigt, aber selbst diese Variante ist mir zu „unhandlich“ und die Ergebnisse waren nicht optimal. Daher verwende ich das im folgenden dargestellte iterative Verfahren.

Iterativer UniWB-Abgleich

Aus der im Abschnitt Weißbildabgleich dargestellten Beziehung folgt, dass zum einen gilt:

\vec{G} = \{W\} \cdot(\{C\}\cdot \vec{H} + \vec{B}).

Und zum anderen für den UniWB-Abgleich gilt:

\vec{G} = \{C\}\cdot (\vec{H_W} + \vec{B}).

Beide Gleichungen lassen sich kombinieren, wodurch sich ergibt:

\vec{H_W}=\{W\}\cdot\vec{H}+\{C\}^{-1}\cdot(\{W\}\cdot\vec{B}-\vec{B})

Hier ist bereits zu erkennen, dass bei einem Schwarzwert gleich Null der erste Summand das Problem löst. Es ist aber ebenso zu erkennen, dass der zweite Summand gegen Null konvergiert, wenn \{W\} gleich der Einheitsmatrix ist, also wird die Iterationsfolge

\vec{H}_{neu}=\{W\}\cdot\vec{H}_{alt}

gegen den gesuchten Vektor \vec{H_W} konvergieren.  Das Einsetzen der Komponentenwerte in den Vektor \vec{H} und in die Matrix \{W\} liefert dann den gesuchten Iterationsalgorithmus

R_{neu} = R_{alt}\cdot {K_r}^{\frac{1}{\gamma}}
G_{neu} = G_{alt}
B_{neu} = B_{alt}\cdot {K_b}^{\frac{1}{\gamma}}.

Die UniWB-Einstellung, Teil1

Einleitung

Die Software von Digitalkameras unterstützt den Fotografen dabei, die richtigen Einstellwerte für die Belichtung zu finden. Insbesondere Fotografen, die vorzugsweise im RAW-Format arbeiten, möchten ihre Fotos häufig so belichten, dass die hellsten bildwichtigen Teile gerade noch nicht überbelichtet sind, um den Belichtungsspielraum des Sensors voll auszunutzen. Hilfsmittel dazu ist meist das Live-Histogramm. Hiermit belichtet man in diesem Fall so, dass die bildwichtigen Lichter gerade noch nicht den rechten Rand des Histogramms erreichen (Exposure To The Right).
Das Histogramm gibt jedoch leider nicht den originalen Inhalt der RAW-Daten des Sensors wieder, sondern wird erst aus dem bereits von der Kamerasoftware online aus der RAW-Datei entwickelten (jpeg-)Foto berechnet. Dabei sind bereits eine Vielzahl von Berechnungen zur Bildverarbeitung, wie Kontrast, Helligkeit und Weißabgleich erfolgt. Daher wird es meist dazu kommen, dass bei der Aufnahme des Fotos der tatsächliche Belichtungsspielraum trotz ggf. konservativer Einstellungen für Kontrast und Helligkeit nicht ausgenutzt wird und ca. eine bis anderthalb Blendenstufen im Raw-Bild nicht genutzt werden. Abhilfe schafft hier die sogenannte UniWB-Einstellung der Kamera. Im Internet sind viele Möglichkeiten dargestellt, wie man diese Einstellung vornehmen kann. Diese Vorschläge erfordern aber meist kompliziertere Prozeduren mit Bildbearbeitungsprogrammen, wie z.B. mit Photoshop, und ein tieferes Verständnis des Farbmanagements digitaler Bildbearbeitung. Ich beschreibe meine etwas einfachere Vorgehensweise im folgenden Text. Besserer Bequemlichkeit halber habe ich für die Rechnerei und Testbilderzeugung ein Python-Skript erstellt, das weiter unten von dieser Website kopiert werden kann, aber eigentlich reichen auch ein Taschenrechner, das frei erhältliche dcraw und ein einfaches Zeichenprogramm, wie Paint o.ä.

Der Trick
Der Sensor einer Digitalkamera hat unterschiedliche Empfindlichkeiten in den drei Farbkanälen Rot, Grün und Blau. Diese Unterschiede werden erst bei der Weiterverarbeitung des RAW-Files ausgeglichen, indem für den Weißabgleich die RAW-Werte der drei Kanäle jeweils mit entsprechenden Korrekturfaktoren multipliziert werden. Da der Kanal für die grüne Farbe am empfindlichsten ist, wird sein Korrekturfaktor auf den Wert Eins gesetzt und die Werte aus dem roten und dem blauen Kanal werden dann jeweils mit von Eins verschiedenen Korrekturfaktoren multipliziert. Der Trick besteht nun darin, alle drei Korrekturwerte auf den Wert Eins zu setzen, also eine „Unitary White Balance“, kurz UniWB-Einstellung vorzunehmen. Dadurch gibt das Live-Histogramm dann die korrekten Verhältnisse der RAW-Farbkanäle im Histogramm viel besser wieder.

Der Nachteil ist jedoch ein Grün-Farbstich des jpeg-Bilds, sowohl im Live-Bild des Kameradisplays als auch des ggf. abgespeicherten jpg-Bilds. Letzteres ist damit praktisch unbrauchbar.
Der korrekte Weißabgleich muss dann immer bei der Entwicklung des RAW-Bilds von Hand vorgenommen werden. Dies ist technisch kein Problem, vergrößert aber den Zeitaufwand.

Es gibt zur Zeit bei keiner Digitalkamera die Möglichkeit, die Werte der Korrekturkoeffizienten für den Weißabgleich direkt einzugeben. Der Trick besteht darin, ein zur Empfindlichkeit der Farbkanäle des Kamerasensors „inverses“ Bild auf einem Monitor zu erzeugen und mit diesem einen manuellen Weißabgleich durchzuführen, sodass dieser Weißabgleich kameraintern in allen drei Farbkanälen Korrekturfaktoren mit einem Wert nahe Eins erzeugt.
Nachdem ich mich eine ganze Weile mit den verschiedenen Möglichkeiten beschäftigt hatte dies zu bewerkstelligen, ist mir eine relativ einfach Variante eingefallen, die ohne komplizierte Mathematik auskommt und auch keine umfassenden Kenntnisse über das Farbmanagement u.ä. erfordert.

Die Vorgehensweise ist iterativ:

  1. Es wird ein Monitorbild mit definierten RGB-Vorgabewerten erzeugt.
  2. Mit diesem Bild wird ein manueller Weißabgleich durchgeführt.
  3. Anschließend wird mit diesem Weißabgleich ein beliebiges gut belichtetes Foto aufgenommen und als Raw-Datei abgespeichert.
  4. Aus den Exif-Daten dieses Fotos werden die Korrekturkoeffizienten Kr und Kb des manuellen Weißabgleichs ausgelesen.
  5. Mit diesen Korrekturkoeffizienten wird dann ein korrigiertes Monitorbild mit neuen RGB-Werten erzeugt. (Diese Arbeit erledigt mein Pythonskript.)

Die Prozedur wird dann wiederholt, und zwar solange, bis die Korrekturfaktoren nahe genug am Zielwert Eins liegen. 5% Abweichung ist nahe genug.
Als weiterer Eingabewert wird der Gamma-Wert (\gamma) des verwendeten Monitors benötigt. Der Gamma-Wert ist für die gleichmäßige Konvergenz der beiden Korrekturfaktoren während der Iteration wichtig. Er kann ausreichend genau mit visuellen Tools aus dem Internet ermittelt werden. Im Pythonskript ist dieser Wert als Variable „Gam“ abgespeichert und muss daher entsprechend angepasst werden. Werte von 1.8 (Mac) oder 2.2 (Windows PC) sind dafür üblich. Für mein IPad habe ich den Wert 2,0 ermittelt. Wichtig ist außerdem, während der Prozedur die Kamera mit immer gleichen Belichtungseinstellungen zu benutzen, also zweckmäßigerweise den manuellen Modus für die Belichtungseinstellungen zu wählen.

Ein Beispiel

Für das Beispiel habe ich meine alte KonicaMinolta A200 benutzt, mit meiner Fujifilm XT-20 hat die Prozedur ebenfalls in gleicher Weise funktioniert.  Zunächst habe ich mit meinem Pythonskript und den Eingaben: R = G = B = 90 und Kr = Kb = 1.0 ein Graubild erzeugt, dieses auf meinem IPad (sein Bildschirm ist besser als mein PC-Monitor) dargestellt und einen manuellen Weißbildabgleich durchgeführt. Mit diesem Abgleich habe ich ein Foto (in meiner Wohnung) gemacht und mir dann mit dcraw die relevanten Koeffizienten anzeigen lassen:

\Projekte\Foto\UniWB\Iteration>dcraw -i -v PICT0140.MRW
Filename: PICT0140.MRW
Camera multipliers: 602.000000 254.000000 400.000000 254.000000

Die Camera Multipliers sind die Parameter des eingestellten Weißabgleichs in der Kamera. Sie werden in dcraw für die sog. Bayer-Anordnung der Farbmatrix angegeben. Es handelt sich daher um die 4 Werte für die Farbkanäle RGBG. Für die weitere Berechnung werden die Werte dann auf den grünen Farbkanal normiert (G=1).
Die gesuchten Korrekturwerte ergeben sich dementsprechend aus den Werten der „Camera multipliers“, und zwar sind in diesem Fall:
Kr = 602.0/254.0 = 2.37 und
Kb = 400.0/254.0 = 1.57.

Mit diesen Werten errechnet das Pythonskript die neuen RGB-Werte aus

R_{neu} = R_{alt} \cdot K_r^{\frac{1}{\gamma}}, G_{neu} = G_{alt}, B_{neu} = B_{alt} \cdot K_r^{\frac{1}{\gamma}},

und mit diesen Werten wird die Prozedur wiederholt. Diese Iteration erfolgt dann solange, bis man mit dem Ergebnis zufrieden ist oder es sich nicht mehr verbessert. (Warum diese Prozedur funktioniert, erkläre ich demnächst in einem anderen Beitrag.)
In dem gewählten Beispiel ergab sich folgender Ablauf:

\Projekte\Foto\UniWB\Iteration>dcraw -i -v PICT0140.MRW
Filename: PICT0140.MRW
Camera multipliers: 602.000000 254.000000 400.000000 254.000000

Filename: PICT0141.MRW
Camera multipliers: 335.000000 254.000000 312.000000 254.000000

Filename: PICT0142.MRW
Camera multipliers: 280.000000 254.000000 281.000000 254.000000

Filename: PICT0143.MRW
Camera multipliers: 272.000000 254.000000 267.000000 254.000000

Filename: PICT0144.MRW
Camera multipliers: 264.000000 254.000000 261.000000 254.000000

Filename: PICT0145.MRW
Camera multipliers: 256.000000 254.000000 260.000000 254.000000

Die dazugehörigen RGB-Werte und Korrekturfaktoren Kr und Kb waren:

  1.   90 90  90  2.37   1.57
  2. 138 90 112 1.319 1.228
  3. 158 90 124 1.102 1.106
  4. 165 90 130 1.071 1.051
  5. 170 90 133 1.039 1.026
  6. 173 90 134 1.008 1.023

Nach 5 Iterationsschritten war meine Zielvorgabe von weniger als 5 %-Abweichung von 1 bereits erreicht.
Das dazugehörige Monitorbild kann abgespeichert und bei Bedarf jederzeit wieder verwendet werden.

Das Pythonskript

Das Python-Skript kann hier heruntergeladen werden.