Ordnung im digitalen Schuhkarton
Halbautomatische Nachbearbeitung von Fotoserien
Kein Widerspruch: Kommandozeile und Bilder
Bei grafischen Bildbearbeitungsprogrammen wendet man eine Bearbeitungsfunktionen in der Regel abhängig davon an, was man sieht. Das funktioniert gut mit wenigen Bildern; sollen jedoch hunderte von Dateien gleichermaßen bearbeitet werden, lässt sich das besser von der Kommandozeile aus bewerkstelligen. Noch erstaunlicher: Einige Aufgaben aus der visuellen Welt meistern zur Zeit überhaupt nur Kommandozeilenprogramme.
Zu den klassischen Einsatzzwecken für solche Filter-Tools zählt das Drehen von Fotos, die mit senkrecht gehaltener Kamera im Hochformat gemacht wurden. Selbst wenn die Kamera einen Orientierungssensor hat, speichert sie eine Bilddatei im Querformat mit dem auf der Seite liegenden Motiv. Bevor Sie Ihre Foto-Sammlung präsentieren, sollten Sie diese Aufnahmen auf jeden Fall drehen, auf dass sie in korrekter Orientierung erscheinen.
Für diese Aufgabe empfehlen sich jhead [4] und das Tool jpegtran aus dem Paket der JPEG-Library libjpeg [5]. jhead erhält die EXIF-Header; jpegtran dreht ohne Neukompression und damit ohne Qualitätsverlust.
Verfügt Ihre Kamera über einen Orientierungssensor (und haben Sie diesen beim Fotografieren aktiviert, siehe Abbildung 5) bringt folgender Befehl alle Fotos in die richtige Orientierung – vorausgesetzt, jhead liegt mindestens in Version 2.0 vor:
jhead -autorot *.jpg
jhead liest dabei die von der Kamera in die EXIF-Header der Fotos geschriebene Orientierungsinformation ein und dreht die Bilder entsprechend mit Hilfe von jpegtran. Leider kommt das Tool nicht mit allen Kamerahaltungen klar, es versagt etwa dann, wenn die Kamera auf dem Kopf steht (Auslöser nach unten) oder das Objektiv senkrecht nach oben oder nach unten zeigt.
Manuelles Drehen beherrschen auch ältere jhead-Versionen. Zwar erfüllt
jpegtran -rot 270 originalbild.jpg > gedrehtesbild.jpg
diese Aufgabe bereits, doch überträgt jpegtran den EXIF-Header aus originalbild.jpg nicht in die Zieldatei gedrehtesbild.jpg, zudem müssen Ausgangs- und Zieldatei verschiedene Namen tragen. Beide Probleme löst der Befehl
jhead -cmd "jpegtran -rot 270 &i > &o" bild.jpg
Mit der -cmd-Option kann jhead jedes beliebige JPEG-Bildmanipulationskommando aufrufen; jhead sichert dann die EXIF-Daten von bild.jpg, führt die gegebene Kommandozeile aus (wobei es für &i den Namen der Ausgangsdatei und für &o den Namen einer temporären Datei einsetzt), fügt die EXIF-Daten in letztere ein und ersetzt die Ausgangsdatei durch die temporäre Datei. So lässt sich jeder Bildbearbeitungsbefehl unter Erhalt des EXIF-Headers durchführen, insbesondere auch Manipulationen mit convert [8] aus dem ImageMagick-Paket [6].
jhead -cmd "..." spielt speziell dann seine Stärken aus, wenn das aufgerufene Kommando selbst nur ein explizit genanntes Bild verarbeiten kann, aber viele Grafikdateien in einem Rutsch manipuliert werden sollen. So dreht
jhead -cmd "jpegtran -rot 270 &i > &o" *.jpg
alle JPEG-Bilder im Arbeitsverzeichnis eins nach dem anderen; den Drehwinkel beschränkt jpegtran allerdings auf 90-Grad-Schritte:
- -rot 90 dreht um 90 Grad nach rechts,
- -rot 270 um 90 Grad nach links,
- -rot 180 um 180 Grad.
Ein weiteres Manko sei nicht verschwiegen: Da jhead die EXIF-Daten an der Manipulation vorbeischleust, bleibt der darin enthaltene Thumbnail gekippt; seine horizontale Auflösung übersteigt weiterhin die vertikale.
Um Tipparbeit zu sparen, lohnt es sich, zwei kleine Shell-Skripte anzulegen. Eines namens rotateleft füllen Sie mit folgendem Inhalt:
#!/bin/sh jhead -cmd "jpegtran -rot 270 &i > &o" $*
In eine zweite neue Datei namens rotateright schreiben Sie
#!/bin/sh jhead -cmd "jpegtran -rot 90 &i > &o" $*
Machen Sie beide Dateien mit
chmod 755 rotateleft rotateright
ausführbar, und schieben Sie sie nach /usr/local/bin. Sofern dieses Verzeichnis im Suchpfad liegt, drehen Sie Ihre Bilder ab jetzt einfach mit rotateleft bild1.jpg nach links bzw. mit rotateright bild2.jpg nach rechts.
Weg mit den toten Pixeln!
Massenbildverarbeitung via Kommandozeile lohnt sich auch beim Entfernen toter Pixel: Solange man die Kamera nicht wechselt, sorgen die Defekte im Bildsensor für Fehlstellen, die sich auf allen Bildern an der gleichen Stelle befinden (Abbildung 6).
Die Retusche-Aufgabe selbst übernimmt jpegpixi [7]; für die Automatisierung des Korrekturprozesses in einer Bilderserie zeichnet wieder einmal jhead verantwortlich. Zum Bestimmen der Positionen der toten Pixel benötigen Sie ein Programm, das Bilder nicht nur anzeigt, sondern auch die Koordinaten des Pixels angibt, über dem sich der Mauszeiger befindet. Sowohl GIMP als auch display aus dem ImageMagick-Paket eignen sich dazu; mit GIMP geht es am einfachsten.
jpegpixi macht nichts anderes, als die auf der Kommandozeile angegebenen Bildbereiche durch eine Interpolation der Umgebung zu ersetzen – das funktioniert natürlich auch bei anderen Störelementen, nicht nur bei toten Pixeln. Dabei komprimiert das Tool nur die Bild-Datenblöcke neu, in denen es etwas wegretuschiert. Da es die übrigen Blöcke nicht antastet, bleibt die Bildqualität weitestgehend erhalten.
Als Erstes müssen Sie die defekten Pixel des Bildsensors Ihrer Kamera finden. Hierzu nehmen Sie ein absolut schwarzes Foto auf, das Sie anschließend am Bildschirm untersuchen. Halten Sie dafür etwas Schwarzes direkt vor das Objektiv (bei einigen Kamera-Typen, z. B. Spiegelreflexkameras, lassen Sie einfach die Schutzkappe auf der Linse). Unterbelichten Sie extrem, indem Sie die Blende möglichst weit schließen und eine möglichst kurze Belichtungszeit wählen. Bei Kameras ohne manuelle Steuerungsmöglichkeit stellen Sie zumindest die Belichtungskorrektur auf den dunkelstmöglichen Wert. Auf jeden Fall schalten Sie den Blitz aus, damit kein Licht durch den Spalt zwischen Objektiv und schwarzem Gegenstand eindringt. Da sowieso nur homogenes Schwarz abgebildet werden soll, braucht die Kamera nicht fokussieren zu können. Stellen Sie als Auflösung diejenige ein, mit der Sie die zu retuschierenden Fotos gemacht haben!
Laden Sie das Schwarzbild in GIMP, und zoomen Sie es soweit auf, dass ein Bildpixel auf einem Pixel des Monitors dargestellt wird (im Kontextmenü des Bilds Ansicht / Zoom / 1:1). Alternativ zoomen Sie mit den Tasten [=] und [-].
Suchen Sie nach hellen Pixeln auf der schwarzen Fläche! Wenn Sie keine finden, darf sich Ihre Kamera eines optimalen Bildsensors rühmen, und Sie brauchen nichts retuschieren. Finden Sie jedoch tote Pixel, zoomen Sie die entsprechenden Bereiche stärker, z. B. ins Verhältnis 4:1, und fahren den Mauszeiger an die linke obere Ecke eines imaginären Quadrats, das den Defekt vollständig bedeckt. Lesen Sie die Koordinaten unten links im GIMP-Bildfenster ab. Gehen Sie mit der Maus zur unteren rechten Ecke des Quadrats, und notieren Sie auch deren Koordinaten. Sollte GIMP anstatt von Pixelkoordinaten (ganze Zahlen, keine Einheit) Maße in Zentimetern oder Zoll anzeigen, schalten Sie im Kontextmenü mit Ansicht / Punkt für Punkt in den "Punkt-für-Punkt"-Modus um.
Unter Angabe des oberen linken Eckpunkts und der Kantenlänge des Quadrats entfernen Sie ein totes Pixel aus einem Bild originalbild.jpg wie folgt:
jpegpixi originalbild.jpg korrigiertesbild.jpg 350,1609,8 1585,865,8
Die Testbildauswertung dieser Kamera ergab zwei Defekte, einen mit den Koordinaten (350,1609) für die obere linke und (358,1617) für die untere rechte Ecke sowie einen zweiten, den das durch (1585,865) und (1593,873) definierte Quadrat beschreibt. Beide Quadrate haben eine Kantenlänge von acht Pixeln. Die korrigierte Bildversion landet in korrigiertesbild.jpg. Unterziehen Sie zunächst das schwarze Testbild dieser Behandlung; es sollte dabei vollkommen schwarz werden.
Eine gesamte Bilderserie korrigieren Sie mit folgendem Skript removedeadpixels automatisch:
#!/bin/sh jhead -cmd "jpegpixi &i &o 350,1609,8 1585,865,8" $*
Nach /usr/local/bin verschoben und ausführbar gemacht, retuschieren Sie alle Bilder in einem Verzeichnis mit dem Kommando
removedeadpixels *.jpg



