5.19. Tonwertkorrekturen

Tonwertkorrekturen verändern, wie Helligkeit und Farbe in einem aufgenommenen Bild verteilt sind – die Korrekturen, die eine Anwendung anwendet, wenn ein Einzelbild zu dunkel, zu hell, zu flach oder in Richtung der falschen Farbe verschoben ist.

Die Korrekturen gehören zu zwei Familien: Helligkeits- und Kontrastanpassungen, die die Helligkeit umverteilen, und Farbanpassungen, die ändern, als welche Farbe jeder Pixel gelesen wird. Beide haben Entsprechungen in der ISP des Sensors, die jedes Einzelbild beim Eintreffen korrigiert; die hier beschriebenen Methoden werden nachträglich auf ein bereits aufgenommenes Image angewendet, für die Fälle, in denen das Einzelbild mehr Korrektur benötigt, als die ISP geliefert hat.

5.19.1. Histogrammausgleich

Die einfachste Kontrastspreizungsoperation ist der Histogrammausgleich. Die Idee besteht darin, die Pixelwerte so umzubilden, dass das Histogramm der Ausgabe so flach wie möglich ist – jeder Wert tritt ungefähr gleich häufig auf. Der visuelle Effekt ist, dass aus einem kontrastarmen Bild (eines, dessen Histogramm in einem schmalen Band konzentriert ist) ein kontrastreiches Bild wird, dessen Pixel den vollen Bereich von 0 bis 255 abdecken.

histeq() führt den Ausgleich aus:

img.histeq()

Der Mechanismus ist direkt. Die kumulative Verteilungsfunktion (CDF) des Histogramms der Quelle wird berechnet; jeder Eingabepixelwert wird auf seine Position in der CDF abgebildet, skaliert auf den Ausgabebereich. Wo die Pixel bereits gleichmäßig verteilt waren, liegt die Abbildung nahe an der Identität; wo sich Pixel bei einer Helligkeit angehäuft hatten, spreizt die Abbildung sie, indem diese Helligkeit über einen breiteren Bereich von Ausgabewerten gestreckt wird.

Das Ergebnis ist bei kontrastarmen Szenen dramatisch – der Unterschied zwischen einer dunklen Innenaufnahme und derselben Aufnahme nach histeq ist oft der Unterschied zwischen „unlesbar“ und „perfekt lesbar“. Der Kompromiss besteht darin, dass die Operation alles verstärkt, einschließlich des Sensorrauschens. Bei einer Szene mit echten kontrastarmen Details, die wiederhergestellt werden sollen, ist histeq die richtige Antwort; bei einer sauberen, gut belichteten Szene, die es schlicht nicht benötigt, führt histeq sichtbares Rauschen ein.

5.19.2. CLAHE: adaptiver Ausgleich

Der Histogrammausgleich ist global: Er verwendet eine aus dem gesamten Bild berechnete CDF und wendet sie überall an. Das funktioniert bei Bildern, deren Helligkeitsbereich annähernd gleichmäßig ist, scheitert aber bei Szenen mit lokal begrenzten dunklen und hellen Bereichen – die CDF wird zu der Seite gezogen, die mehr Pixel hat, und die gegenüberliegende Seite wird überkorrigiert.

Die adaptive Variante ist die Contrast Limited Adaptive Histogram Equalisation, üblicherweise als CLAHE bezeichnet. Anstelle einer globalen CDF berechnet CLAHE für jede kleine Kachel des Bildes eine separate CDF, gleicht jede Kachel anhand ihrer eigenen CDF aus und blendet die Kachelgrenzen ineinander über. Das Ergebnis ist, dass Helligkeitsanpassungen lokal erfolgen – die beschattete Ecke erhält ihren eigenen Ausgleich, ohne dass die helle Ecke sie in die falsche Richtung zieht.

Das Flag adaptive=True schaltet histeq() in den CLAHE-Modus:

img.histeq(adaptive=True, clip_limit=10)

Der Parameter clip_limit ist der Teil von CLAHE, auf den sich das „contrast limited“ im Namen bezieht. Lokaler Ausgleich kann Rauschen in flachen Bereichen, in denen die CDF nur sehr wenige verschiedene Werte hat, übermäßig verstärken; das Clip-Limit begrenzt, wie aggressiv ein einzelner Bin umverteilt werden darf, was die Rauschverstärkung verhindert, während die Kontrastspreizung dort, wo sie wichtig ist, weiterhin zulässig bleibt. Ein Wert um 10 ist ein vernünftiger Ausgangspunkt; größere Werte lassen CLAHE stärker arbeiten, auf Kosten von mehr sichtbarem Rauschen, kleinere Werte machen es sanfter.

CLAHE ist aufwendiger als das globale histeq, liefert aber sauberere Ergebnisse bei Szenen, in denen die Helligkeit ungleichmäßig verteilt ist – was bei den meisten realen Szenen der Fall ist.

5.19.3. Gamma, Kontrast und Helligkeit

Der Histogrammausgleich ist die datengetriebene Methode, um die Helligkeit umzubilden. Die datenunabhängige Methode besteht darin, eine gewählte Kurve anzuwenden, parametrisiert durch einige leicht einstellbare Regler. gamma() bietet drei davon:

img.gamma(gamma=1.0, contrast=1.0, brightness=0.0)

Jeder Parameter wendet eine bestimmte Transformation auf jeden Pixel an:

gamma führt den Wert jedes Pixels durch die Potenzfunktion output = input ** (1 / gamma). Die übliche Bedeutung: Werte größer als 1.0 hellen das Bild auf und heben die Mitteltöne an (die klassische „Monitor-Gamma“-Korrektur); Werte kleiner als 1.0 verdunkeln es. Der Parameter ist nichtlinear – er erhält den Schwarz- und Weißpunkt und formt nur die Verteilung dazwischen um, was das richtige Verhalten ist, wenn das Ziel darin besteht, Details in Schatten- oder Lichterbereichen wiederherzustellen, ohne die vorhandenen Extreme zu zerstören.

contrast führt jeden Pixel durch eine reine Multiplikation um den Mittelgraupunkt herum. Werte größer als 1.0 erhöhen den Kontrast (Dunkles wird dunkler, Helles wird heller, Mittelgrau bleibt gleich); Werte kleiner als 1.0 verringern den Kontrast.

brightness addiert eine Konstante zu jedem Pixelwert. Positive Werte hellen auf, negative Werte verdunkeln. Die Verschiebung ist gleichmäßig – nichts bleibt erhalten – was selten das ist, was eine Anwendung für sich genommen möchte, sich aber gut mit einem Kontrastdurchlauf kombinieren lässt, um das Ergebnis neu zu zentrieren.

Die drei Parameter lassen sich kombinieren: Ein einzelner gamma()-Aufruf kann eine Gammakurve, dann eine Kontrastmultiplikation und dann eine Helligkeitsverschiebung anwenden, alles in einem Durchlauf. Die Reihenfolge ist zuerst Gamma, dann Kontrast, dann Helligkeit, was der Reihenfolge entspricht, die die intuitivsten Ergebnisse liefert, wenn alle drei vom Standard abweichen.

5.19.4. Automatischer Weißabgleich

Die Farbfamilie der Tonwertkorrekturen beginnt mit dem automatischen Weißabgleich. Derselbe Mechanismus, den die ISP des Sensors als Teil der Bildverarbeitungspipeline ausführt – das Anpassen der relativen Verstärkungen der Rot-, Grün- und Blaukanäle, damit ein durchschnittlich grau gefärbter Bereich als tatsächliches Grau gelesen wird – ist auch als Operation nach der Aufnahme an einem fertigen Image verfügbar:

img.awb()

Die Standardeinstellung verwendet den Gray-World-Algorithmus: Es wird angenommen, dass die Durchschnittsfarbe des gesamten Bildes neutrales Grau ist, und die Verstärkungen pro Kanal werden entsprechend angepasst. Die alternative Form max=True verwendet den White-Patch-Algorithmus: Es wird angenommen, dass die hellsten Pixel neutrales Weiß sind, und die Verstärkungen werden entsprechend angepasst. Beide funktionieren mit RGB565 und mit rohem Bayer; keiner funktioniert mit Graustufen (wo es keine Farbe zum Abgleichen gibt) oder YUV (wo die Farbdarstellung nicht jene ist, mit der diese Algorithmen arbeiten).

Wann man auf die Form nach der Aufnahme statt auf den automatischen Weißabgleich der ISP zurückgreifen sollte: wenn die Wahl der ISP für die jeweilige Szene schlecht passte, wenn die Anwendung Referenz-Einzelbilder von der Festplatte lädt, die unter anderen Bedingungen aufgenommen wurden, oder wenn die Farbbeurteilung wichtig genug ist, dass die Anwendung sie mit ihrer eigenen Wahl des Algorithmus erneut ausführen möchte.

5.19.5. Die Farbkorrekturmatrix

Wenn die vom Bild benötigte Farbkorrektur nicht die kanalweise Skalierung ist, die der Weißabgleich liefert, sondern eine allgemeinere Kanalmischung, ist die zu wählende Operation die Farbkorrekturmatrix. Die Methode ccm() wendet eine 3-mal-3-Matrix (oder 3-mal-4 mit Offset) an, die den (r, g, b)-Vektor jedes Pixels multipliziert, um einen neuen (r, g, b)-Vektor zu erzeugen:

img.ccm([[1.1, -0.05, -0.05],
        [-0.05, 1.1, -0.05],
        [-0.05, -0.05, 1.1]])

Die Matrix ermöglicht es der Anwendung, Übersprechen zwischen den Farbkanälen zu korrigieren – wenn beispielsweise die Antwort des Rotsensors etwas grünes Licht enthält, kann die Matrix einen Bruchteil des Grünkanals von der Rotausgabe subtrahieren, um dies zu kompensieren. In Kombination mit einem Offset pro Kanal ermöglicht die 3-mal-4-Form der Anwendung außerdem, jeden Kanal neu auf null zu setzen.

Das Material zur ISP-Pipeline behandelt das Warum von Farbkorrekturmatrizen. Die Form nach der Aufnahme am Image ist lediglich dieselbe Operation, nachträglich angewendet.