Der eigene Foto-Look mit OpenCV

Immer wieder beschäftige ich mich mit der Nachbearbeitung der eigenen Bilder. Dabei „entwickle“ ich die Bilder auch gern etwas künstlerischer, wie z.B. mit zu hohem Kontrast oder gewissen Farbeinschlägen. Einige dieser Effekte bekommt man bereits mit den Gradationskurven (in Photoshop/Lightroom) bzw. den Kurven (in GIMP) umgesetzt. Leider muss dafür immer manuell ein Programm bedient werden. Daher habe ich es mir dieses Wochenende zum Ziel gemacht, diesen Schritt zu automatisieren. In diesem Beitrag zeige ich euch, welche Probleme es gab und wie ich es gelöst habe.

Zunächst muss man die Gradationskurven erst einmal verstehen. Im Grunde handelt es sich um eine einfache Abbildung eines jeden Farbwerts auf einen anderen Farbwert. Einfach gesagt: alle Pixel mit der Farbintensität X sollen zukünftig die Farbintensität Y haben und das für jeden Pixel in dem roten, grünen und blauen Farbkanal. Um dies zu Speichern benötigen wir also eigentlich nur eine Abbildungstabelle für jeden Farbkanal. Aus diesem Grund werden diese Kurven auch Lookup-Tables (LUTs) genannt.

Um die Bilder automatisiert verarbeiten zu können, habe ich mich der freien Bibliothek OpenCV bedient. Hier schöpft man aus dem Vollen und kann auf viele fertige Algorithmen zurückgreifen, wie z.B. der Rauschreduktion. Der Kernpunkt war allerdings die performante LUT-Funktion, mit welcher fertige LUTs genutzt werden können. Hier begann jedoch das eigentliche Problem. Woher bekomme ich nun diese Abbildungstabelle?

Eine Möglichkeit wäre ein Export aus gängigen Bildbearbeitungsprogrammen. GIMP bietet beispielsweise so ein Export, leider ist das Format nicht kompatibel und kann nicht ohne weiteres mit OpenCV verwendet werden. Eine mathematische Funktion, die mir die Wert von 0 bis 255 so zuweist, wie ich das möchte, erscheint mir anhand meiner mathematischen Fähigkeiten zu kompliziert und zum Ausprobieren nicht wirklich praktisch nutzbar. Also habe ich mich dazu entschlossen ein kleines Tool zu entwickeln, mit dem die Kurve einfach Freihand eingezeichnet werden kann. Ein Export liefert dann direkt die Liste, welche für die LUT-Funktion in OpenCV benötigt wird.

Da das kleine „Helferlein“ war mit Processing so schnell umgesetzt, dass ich mich entschlossen habe noch eine Vorschaufunktion und einen Farbkanal-Wechsler einzubauen.

Screenshot.png

Für alle die keine Erfahrungen mit den Gradationskurven haben sei das Prinzip hier nochmal etwas genauer erläutert: Auf der „X-Achse“ werden von links nach rechts die Werte 0 bis 255  und auf der „Y-Achse“ von unten nach oben die Werte 0 bis 255 aufgetragen. Bei diesen Werten handelt es sich um jeden möglichen Farbwert eines Farbkanals (bei 8-Bit). In der Lookup-Tabelle kann nun jedem Wert ein „neuer Wert“ auf der Y-Achse zugewiesen werden. Dadurch können Farbbereich z.B. hervorgehoben werden. In dem Screenshot ist die typische „S-Kurve“ dargestellt. Wird diese über alle Farbkanäle angewendet, so werden die dunklen Bereiche etwas dunkler und die hellen etwas heller, kurz Kontrast erhöht. Wenn diese Kurven nun nicht gleichartig auf alle Farbkanäle angewandt werden, können schöne Look erziehlt werden, wie es auch in Kinostreifen gemacht wird.

Nachfolgend mal ein (qualitativ schlechtes) GIF für den Vorher-Nachher-Vergleich.

lut

Die exportierte Abbildungstabelle kann anschließend leicht in einem OpenCV 2 Python-Skript verwendet werden:

img = cv2.LUT(img, lut_sat)

Wer nun auch Interesse an einer eigenen LUT hat oder vielleicht nur etwas experimentieren möchte, kann gerne das kleine Helferlein auf GitHub herunterladen und benutzen, aber auch anpassen oder erweitern. Ich freue mich über Feedback 🙂

 

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s