Aus Linux-Magazin 08/2008

Automatische Bildbearbeitung mit Imagemagick

© Anyka, Fotolia.com

Fotos mit Imagemagick bearbeiten erscheint manchem wie Hexerei: Durch Hunderte Optionen beeinflusst, zaubern die Kommandozeilenwerkzeuge Kunstwerke aus banalen Bildern oder verwandeln ihr Format. Ein Meister der Bildmagie braucht etwas Hintergrundwissen und viel Fantasie.

Wer bei Bildbearbeitung nur an Gimp denkt, übersieht das für viele Aufgabe besser geeignete Imagemagick [1]. Automatisierung, Skripting, Reproduzierbarkeit, Batchverarbeitung – das ist bei Gimp zwar möglich, geht mit Imagemagick aber deutlich leichter. Das Paket besteht aus elf Kommandozeilenprogrammen, angereichert mit Modulen und Schnittstellen für etliche Programmiersprachen von Ada über C, C++ und Java bis Perl, Python, PHP und mehr.

Doch die Mächtigkeit hat ihren Preis: Die Bedienung ist nicht gerade intuitiv, was viele Anwender zum Trial-and-Error-Verfahren verleitet. Das undankbare Resultat sind Imagemagick-Skripte, die zwar augenscheinlich funktionieren, bereits bei leicht geänderten Randbedingungen aber scheitern. Dieser Artikel erklärt die Philosophie hinter dem Programmpaket, um solche Missgeschicke zu vermeiden. Der erste Teil erläutert, wie Imagemagick funktioniert (siehe auch Kasten “Imagemagick intern”), während der zweite Abschnitt an praktischen Beispielen wichtige Optionen vorstellt.

Imagemagick intern

Imagemagick verarbeitet Rasterbilder, also Bilder, die aus Pixeln bestehen. Vektorformate verwandelt Imagemagick intern immer in ein Rasterformat. Für seine Bildverarbeitungsalgorithmen braucht Imagemagick mal einzelne Pixel, mal ganze Bildzeilen oder rechteckige Ausschnitte aus dem Bild. Das Tool arbeitet daher intern mit einem so genannten Pixel-Cache, der den Zugriff auf Bildausschnitte beschleunigt. Für verlustfreie Jpeg-Operationen ist Imagemagick aber nicht geeignet – bei jedem Programmlauf liest es das Bild ein und komprimiert es beim Abspeichern erneut.

Der Pixel-Cache besteht aus vier bis fünf Kanälen. Die ersten vier bilden üblicherweise den Rot-, Grün- und Blau- beziehungsweise Cyan-, Magenta- und Gelb- sowie den Alpha-Kanal. Der letzte optionale Kanal ist für Bilder mit Farbpalette reserviert oder enthält den Schwarz-Kanal bei CMYK-Bildern. Je nachdem, mit welcher Option Imagemagick kompiliert wurde, stehen 8-, 16- oder 32-Bit-Kanäle bereit. In der HDRI-Version sind es 32-Bit-Fließkommawerte, sonst Integers. Der Aufruf »identify -version« informiert über die verfügbare Bittiefe.

Eine geringere Bittiefe bedeutet immer eine schnellere Bearbeitung. Wer also typischerweise nur die Jpeg-Fotos aus seiner Kompaktkamera bearbeitet, kommt mit der Q8-Version gut über die Runden, üblich ist eher Q16.

Ausgefeiltes API

Das Imagemagick-API bietet mehrere Methoden, um auf den Cache zuzugreifen. Der Cache befriedigt sogar Anfragen nach Pixeln außerhalb des eigentlichen Bildes (so genannte Virtual Pixel). Das ist wichtig, um Pixel am Bildrand mit denselben Algorithmen bearbeiten zu können wie alle anderen. Der Pixel-Cache kann in verschiedenen Speicherbereichen oder auf der Platte liegen. Die definierten Grenzen sind mit »convert -list resource« zu erfahren.

Der Cache-Manager verwaltet den Cache und die darin enthaltenen Pixel über Referenzzähler. Eine Clone-Operation kopiert nur die Cache-Attribute und die veränderten Pixel. Das sichert hohe Performance. Neben dem Cache speichert und bearbeitet Imagemagick auch die Bild-Metadaten, zum Beispiel Farb- und Exif-Profile oder Daten wie Breite und Höhe.

Image-Coder und Delegates

Um möglichst einfach erweiterbar zu sein, verwendet Imagemagick so genannte Image-Coder für die Bearbeitung einzelner Bildformate. Die Coder selbst sind als dynamische Bibliotheken realisiert, die Konfiguration liegt in »/usr/lib/ImageMagick-6.3.5/config/coder.xml«.

Die Bearbeitung delegiert Imagemagick teils an externe Programme. Raw-Formate sind so mit »ufraw-batch« oder dem klassischen »dcraw« verfügbar. Die externen Programme müssen nur eines der in Imagemagick eingebauten Formate schreiben oder lesen können. In »/usr/lib/ImageMagick-6.3.5/config/delegates.xml« steht deren Konfiguration.

Optionen

Wer von Imagemagick spricht, meint meist »convert« – das Programm wandelt Bilder um. Es steht im Mittelpunkt dieses Artikels, da es sich um das mächtigste und meistgenutzte Tool der Sammlung handelt und die anderen Programme ähnlich funktionieren.

Convert & Co. sind zwar Kommandozeilenprogramme, sie halten sich aber nicht an den Unix-Standard. Normalerweise bestehen Optionen aus einem Buchstaben, eingeleitet durch ein Minuszeichen, etwa »cp -r«. Alternativ gibt es lange Optionen: »cp –recursive«. Danach folgen als Argumente meist die Dateien, auf denen die Programme operieren. Alle Optionen der Imagemagick-Programme beginnen entgegen dieser Konvention mit nur einem Minus- oder einem Pluszeichen, gefolgt von einer Zeichenkette, etwa »-border«, »-bordercolor« oder »+gravity«. Die Programme erwarten Argumente und Optionen auch an anderen Stellen.

Während frühe Imagemagick-Versionen die Optionen noch weitgehend Unix-üblich interpretierten, führten die Entwickler in Version 6 ein eigenes, in sich konsistentes Konzept ein. Für die Bildbearbeitung ist zum Beispiel die Reihenfolge der Optionen entscheidend. Die Tools unterstützen zwar nach Möglichkeit noch das alte Verhalten, in neuen Skripten empfiehlt es sich aber, diese Konstrukte zu meiden. Dass dies mitunter schwerfällt, ist auch in neueren Artikeln noch zu beobachten [2].

Die recht beeindruckende Menge von 232 Optionen in Imagemagick 6.3.5 verteilt sich auf zwei Gruppen: Einstellungen (Settings) und Operatoren (Operators). Einstellungen ändern nichts am Bild, Imagemagick speichert den neuen Wert lediglich für spätere Operationen. Einen Operator führt Convert sofort aus. Zum Beispiel setzt die Einstellung »-bordercolor blue« die Randfarbe, aber erst der Operator »-border 5« erzeugt einen blauen Rand mit fünf Pixeln Breite.

Rechenmaschine

Die Mathematik und die Informatik kennen drei Varianten, um Operationen zu notieren:

  • Infix-Schreibweise: »a+b«
  • Präfix-Schreibweise: Lisp-typisch als »+ a b«
    oder in der Funktionsnotation »+(a,b)«
  • Postfix-Schreibweise: »a b +«

Letztere ist von der Umgekehrten Polnischen Notation (UPN) bekannt und maschinennah, da die Rechenmaschine die Operanden auf den Stack legt und bei der Abarbeitung von Operatoren genau weiß, wie viele Operanden sie wieder vom Stack nimmt. Auch Imagemagick arbeitet als Rechenmaschine und verarbeitet die Operatoren in Postfix-Notation. Allerdings versucht das Programm – wie erwähnt – auch noch die alte, Unix-nahe Präfix-Variante zu interpretieren.

Ein- und Ausgabebild

Naiv betrachtet dienen die an der Kommandozeile angegebenen Input-Bilder auch als Operanden. Tatsächlich sind Operanden aber die Bilder im Speicher, die Convert schrittweise verändert. Bilder auf der Kommandozeile sind dabei auch nur Operatoren, die Bilddateien in den Speicher laden:

convert -bordercolor blue bild1.jpg bild2.jpg -border 5 out.jpg

Zunächst setzt der Aufruf »-bordercolor blue« die Randfarbe auf Blau. Danach sorgt »bild1.jpg bild2.jpg« dafür, dass das Tool die beiden Bilder in den Speicher lädt. Anschließend malt »-border 5« einen Rand mit der aktuellen Randfarbe (Blau) um jedes der beiden Bilder im Speicher. Abschließend sorgt »out.jpg« dafür, dass Convert die Bilder aus dem Speicher in die Dateien »out-0.jpg« und »out-1.jpg« legt. Abbildung 1 zeigt den Ablauf für ein komplexeres Kommando, das ein Bild komplett neu erzeugt:

convert -size 100x100 -bordercolor yellow xc:blue gradient:red -border 10 +append grafik.gif
Abbildung 1: Schematischer Ablauf der Verarbeitung mit »convert«. Der weiße Kastenteil zeigt alle Bilder im Speicher, darunter stehen die jeweiligen Einstellungen.

Abbildung 1: Schematischer Ablauf der Verarbeitung mit »convert«. Der weiße Kastenteil zeigt alle Bilder im Speicher, darunter stehen die jeweiligen Einstellungen.

Allein die Stelle, an der ein Dateiname steht, entscheidet, ob es eine Ein- oder Ausgabebilddatei ist. Die allgemeine Syntax für Bildnamen lautet:

  • »Format:Dateiname[WxH]« oder
  • »Format:Dateiname[WxH+X+Y]«

Dabei stehen W für Breite, H für Höhe sowie X und Y für den Offset. Nötig ist dieser Aufwand in den meisten Fällen nicht, da Imagemagick fast alle Formate eigenständig erkennt. Die Geometrieangaben skalieren in der ersten Variante das Bild schon beim Einlesen auf die angegebene Breite mal Höhe, die zweite Variante schneidet hingegen den angegebenen Teil des Bildes heraus. Beide Angaben sind gerade bei der Verarbeitung vieler Bilder nützlich, da sie den Speicherbedarf und die Laufzeit reduzieren.

Es gibt sogar etliche spezielle Formatangaben, die neue Bilder erzeugen statt vorhandene zu lesen, etwa die bereits genannte »xc:« (neue Zeichenfläche) und »gradient:« (Farbverlauf). Zu jedem Zeitpunkt hält Imagemagick eine Liste mit seinen Bildern im Speicher und wendet die Operatoren nach der Postfix-Notation an. Manche Operatoren wirken auf jedes Bild einzeln, manche ersetzen dagegen die Liste durch ein einzelnes Bild.

Das Skript aus Listing 1 fügt zwei Bilder zusammen und umgibt sie mit einem Rand. Der Convert-Befehl in Zeile 4 erzeugt ein blaues Quadrat; »xc:blue« ist dabei ein spezielles internes Format für ein Canvas, das an der Stelle eines Eingabebildes steht. Analog erstellt Zeile 5 ein Quadrat, gefüllt mit einem roten Gradienten. Abbildungen 2a und 2b zeigen die Ergebnisse der Zeilen 6 und 7.

Listing 1:
Reihenfolge

01 #!/bin/bash
02 
03 SIZE="100x100"
04 convert -size "$SIZE" xc:blue  blue.gif
05 convert -size "$SIZE" gradient:red  red.gif
06 convert blue.gif red.gif -bordercolor yellow +append -border 10 append-border.gif
07 convert blue.gif red.gif -bordercolor yellow -border 10 +append border-append.gif

Der Operator »-border« verändert jedes Bild im Speicher, während »+append« alle Bilder horizontal (bei »-append« wäre es vertikal) aneinanderhängt und die Bilderliste durch das Ergebnis ersetzt. Folgerichtig ist in Abbildung 2a ein gemeinsamer Rand um die Quadrate zu sehen (Append vor Border), während Abbildung 2b zwei Quadrate mit je einem eigenen Rand zeigt.

Ob Imagemagick eine Option als Einstellung interpretiert oder sie wie ein Operator wirkt, steht in der Dokumentation. Die Beschreibung der Optionen ist zwar recht knapp gehalten, eine Fülle von Informationen hält aber die Usage-Seite bereit [3]. Wenn das nicht hilft, bleiben immer noch eigene Experimente oder Hilfe von den Mailinglisten [4].

Abbildung 2a: Auf die Reihenfolge kommt es an: »+append -border« fügt erst die Bilder zusammen und gibt ihnen dann einen gemeinsamen Rand.

Abbildung 2a: Auf die Reihenfolge kommt es an: »+append -border« fügt erst die Bilder zusammen und gibt ihnen dann einen gemeinsamen Rand.

Abbildung 2b: Dagegen verleiht »-border +append« beiden Quadrat einen eigenen Rand und klebt die Bilder erst danach aneinander.

Abbildung 2b: Dagegen verleiht »-border +append« beiden Quadrat einen eigenen Rand und klebt die Bilder erst danach aneinander.

Anwendungsbeispiele

Nach dieser generellen Einführung wird es Zeit für Beispiele aus der Praxis. Recht oft ist es nötig, die Bilder einer Fotoreihe Web-tauglich anzupassen. Convert kennt eine ganze Reihe von Operatoren, die die Größe eines Bildes ändern; überraschenderweise gehört ausgerechnet »-size« nicht dazu. Listing 2 zeigt die falsche und die richtige Anwendung von »-size«. In Zeile 1 erzeugt der »xc«-Operator ein Bild mit der durch die Einstellung »-size 1024×2048« vorgegebenen Größe. Das »identify«-Kommando aus der Imagemagick-Toolsammlung gibt dann in Zeile 3 die Größe des Bildes in Pixel aus (ebenso in den Zeilen 6, 9 und 12).

Listing 2:
Größenänderung

01 $ convert -size 1024x2048 xc:blue largeblue.jpg
02 $ identify -format "Größe: %wx%hn" largeblue.jpg
03 Größe: 1024x2048
04 $ convert -size 512x1024 largeblue.jpg smallblue.jpg
05 $ identify -format "Größe: %wx%hn" smallblue.jpg
06 Größe: 512x1024
07 $ convert -size 600x1200 largeblue.jpg smallblue.jpg
08 $ identify -format "Größe: %wx%hn" smallblue.jpg
09 Größe: 1024x2048
10 $ convert largeblue.jpg -resize 600x1200 smallblue.jpg
11 $ identify -format "Größe: %wx%hn" smallblue.jpg
12 Größe: 600x1200

Das Kommando in Zeile 4 verkleinert das Bild tatsächlich wie gewünscht, die folgenden beiden Zeilen zeigen es. Allerdings scheitert ein ähnlicher Versuch in Zeile 7. Hintergrund ist, dass »-size« nur eine Einstellung vornimmt, die sich auf verschiedene Operatoren unterschiedlich auswirkt. Die Jpeg-Bibliothek kann Bilder in einer geringeren Auflösung einlesen; sie haben in jeder Achse dann die Hälfte oder ein Viertel der Bildpunkte. Die Bibliothek wählt aus der »-size«-Einstellung das nächstgrößere verfügbare Format. Für die Größenangaben aus Zeile 7 ist das aber das Gesamtbild.

Skalieren

Der beste Operator für die Größenänderung von Bildern ist »-resize« (siehe auch Tabelle 1). Per Default behält er das Seitenverhältnis bei und passt das neue Bild in die vorgegebenen Maße ein – es kann in einer Achse also kleiner ausfallen als gedacht. Mit einer Reihe von Schaltern lässt sich dieses Verhalten ändern. Ein Ausrufezeichen innerhalb der Zielgröße, etwa »-resize 100×150!«, setzt absolute Maße und verzerrt das Bild bei Bedarf. Ebenfalls möglich ist ein »%« für relative Größen oder ein »>«, das Bilder nur verkleinert, wenn sie größer sind als das angegebene Format, aber nie vergrößert. Analog dazu vergrößert »<« nur, ohne je zu verkleinern.

Tabelle 1: Bild
skalieren

Sinnvoll sind die vielen verfügbaren Operatoren (Tabelle 1) vor allem wegen der unvermeidbaren Artefakte, die durch Größenänderungen entstehen. Die Bilder werden mal überschärft, mal unscharf und es entstehen Moiré-Effekte, Aliasing (Treppenstufen), Block-Artefakte oder Halos (auch Heiligenschein genannt). Imagemagick kennt deshalb zusätzlich zu Operatoren eine Menge so genannter Resizing-Filter. Eine kurze Einführung gibt der Kasten “Resize-Filter”. In den meisten Fällen genügt aber der Standard-Operator »-resize«.

Resize-Filter

Theoretisch ist eine Skalierung von n1*m1 auf n2*m2 Pixel eine Funktion mit n1*m1 Eingabewerten und n2*m2 Ergebnissen. In der Praxis genügen weit simplere Funktionen, da die linke obere Ecke des Quellbilds zwar einen großen Einfluss auf die linke obere Ecke des Zielbilds hat, nicht aber auf die rechte untere. Je weiter die Pixel entfernt sind, umso kleiner wird ihr Einfluss, bis er auf null sinkt.

Statt die Skalierung als Funktion der Pixel zu formulieren, verwenden Imagemagick & Co. als Parameter die Distanz der Pixel von einem Zentrum sowie den relativen Einfluss (das Gewicht) in Abhängigkeit von der Distanz. Die Gewichtsfunktionen heißen Filter, die Umgebung um das Zentrum Support oder auch Support-Window. Gleiches gilt für andere Bildbearbeitungsfunktionen wie Rotation oder Schärfen.

Einfach, aber kaum geeignet: Interpolation

Die einfachsten und am wenigsten geeigneten Filter beruhen auf Interpolation. Die Option »-filter point« wählt die primitivste Form: Das Pixel, das der Zielposition in der Quelle am nächsten liegt, gewinnt. Bei einem Schachbrett etwa ist die linke obere Ecke ein weißes Feld. Beim Skalieren bleibt das linke obere Feld weiß, bei den anderen Feldern hängt der Effekt von der genauen Größenänderung ab. Schrumpft das Bild auf ein Achtel, wird es sogar ganz weiß, da keinem der Zielpunkte ein schwarzes Feld der Eingabedatei am nächsten liegt.

Mit der Option »-filter box« berechnet Resize dagegen den Durchschnitt der umgebenden Pixel, das endgültige Bild wird grau. Allerdings bezieht der Box-Filter nur eine begrenzte Zahl an Quellpunkten in die Interpolation mit ein; bei starken Verkleinerungen wirken sich viele Quellpunkte gar nicht auf das Resultat aus. Ein paar einfache Kommandos zeigen die Effekte:

convert -size 8x8 pattern:gray50 -rotate 90 chess.gif
convert chess.gif -resize 800x800 chess800.gif

Diese hundertfache Vergrößerung ergibt ein recht psychedelisches Muster (Abbildung 3a). Das gewünschte Ergebnis liefert der Point-Filter (siehe Abbildung 3b):

convert chess.gif -filter Point -resize 800x800 chess800p.gif

Da der Point-Filter keine Durchschnittswerte bildet, bleibt das Resultat schachbrettartig mit scharfen Kanten. Verkleinert man das Ergebnis wieder und nutzt diesmal den Box-Filter, kommt es zu grauen Streifen an den Kanten der Quadrate (Abbildung 3c):

convert chess800p.gif -filter Box -resize 100x100 chess100b.gif

In Filterfunktionen gesprochen hat die Point-Methode das Gewicht 1 im Zentrum (für den Abstand 0) und 0 für größere Distanzen. Die Box-Methode verwendet eine Sprungfunktion: Das Gewicht ist 1 für einen Radius von 0 bis 0,5, ansonsten 0. Bei bilinearer Interpolation (auch Dreiecks- oder Triangle-Filter genannt) sinkt das Gewicht linear zwischen Zentrum und Radius 1 von 1 auf 0. Eine weitere Verbesserung ergeben Filter, die den linearen Verlauf der Gewichte durch andere Funktionen ersetzen.

Im Gegensatz zu den Interpolationsfiltern, die ab einer Distanz von 1 stets das Gewicht 0 anwenden, haben andere Filter für größere Radien ein positives Gewicht. Das heißt, dass letztlich mehr als zwei Pixel in die Berechnung einfließen. Das Ergebnis sieht zwar unscharf aus, vermindert aber die Moirés und Blockartefakte der Interpolationsfilter. Typische Vertreter sind Gaussian, Quadratic, Cubic und Mitchell.

Eine weitere Klasse von Filtern, die so genannten Sinc- oder Bessel-Filter, vermeiden Blurring und sind auch nicht anfällig für Moirés und Blockartefakte. Sie fallen aber nicht schnell auf das Gewicht 0 und nehmen sogar negative Werte an, was die Berechnung aufwändig und langsam macht. Imagemagick verwendet daher Varianten, die mittels einer weiteren Funktion das Support-Window einschränken, etwa den Lanczos-Filter. Eine Alternative sind Lagrange-Filter, die über schnell berechenbare Polynome die echten Sinc-/Besselfunktionen annähern.

Feintuning ist möglich, aber selten sinnvoll

Hier wie überall gilt: Imagemagick erlaubt es dem Benutzer, den Filter und seine Parameter sehr fein zu steuern. Meist ist der Aufwand aber nicht nötig, da das Tool bereits sehr gute Vorgaben verwendet: Es nutzt einen Mitchell-Filter zum Vergrößern sowie zum Verkleinern von Bildern mit Transparenz. Beim Verkleinern ohne Transparenz greift es auf einen Lanczos-Filter zurück. Insbesondere bei grafischen Motiven mit dünnen Linien und harten Kanten kann es aber lohnen, verschiedene Filter auszuprobieren. Weitere Details und Hintergründe verrät die Imagemagick-Dokumentation [5].

Abbildung 3a: Nach dem Vergrößern mit dem Default-Filter sieht ein Schachbrettmuster recht psychedelisch aus.

Abbildung 3a: Nach dem Vergrößern mit dem Default-Filter sieht ein Schachbrettmuster recht psychedelisch aus.

Abbildung 3b: Der simple Point-Filter berechnet keine Zwischenwerte und sorgt daher beim Vergrößern für ein scharfes Schachbrett.

Abbildung 3b: Der simple Point-Filter berechnet keine Zwischenwerte und sorgt daher beim Vergrößern für ein scharfes Schachbrett.

Abbildung 3c: Beim Verkleinern berechnen Box-Filter an den Kanten Übergangswerte. Das Ergebnis wirkt unscharf (hier vergrößert dargestellt).

Abbildung 3c: Beim Verkleinern berechnen Box-Filter an den Kanten Übergangswerte. Das Ergebnis wirkt unscharf (hier vergrößert dargestellt).

Farbräume und -Profile

Farbsysteme (auch Farbmodi genannt), etwa RGB, Lab oder CMYK, legen die Kodierung von Pixeln fest. RGB beschreibt dabei ein additives Modell (Rot, Grün, Blau), CMYK ein subtraktives Modell (Cyan, Magenta, Gelb und Schwarz). Abbildung 4a zeigt als Beispiel eine dreidimensionale Darstellung des RGB-Farbsystems, der Koordinatenursprung (0,0,0), also Schwarz, ist dabei verdeckt. Neben der Triplet-Kodierung gibt es auch andere mathematische Darstellungen, die je nach Zweck sinnvoller sein können (siehe Abbildung 4b).

Mit der Kodierung eines Pixels, etwa als RGB-Tripel (200,0,0), ist aber die Farbe noch nicht festgelegt, denn die Farbdefinition eines Pixels gilt nur innerhalb eines so genannten Farbraums. Farbräume haben Namen und beziehen sich jeweils auf ein Farbsystem. Für RGB gibt es verschiedenste Farbräume, etwa S-RGB oder Adobe-RGB. Farbprofile beschreiben diese Farbräume und legen so zusammen mit den Pixelwerten die Farbinterpretation fest. Dasselbe Hellrot hat in verschiedenen Farbräumen unterschiedliche Pixelwerte und derselbe Pixelwert entspricht je nach Farbraum unterschiedlichen Farben.

Abbildung 4a: Das RGB-Farbsystem als Würfel. Am Ursprung des Koordinatensystems ist keine Farbe aktiv (0,0,0), was im additiven RGB Schwarz ergibt.

Abbildung 4a: Das RGB-Farbsystem als Würfel. Am Ursprung des Koordinatensystems ist keine Farbe aktiv (0,0,0), was im additiven RGB Schwarz ergibt.

Abbildung 4b: Das RGB-Farbsystem in einer alternativen Darstellung, die sich für den Vergleich von Farbräumen besser eignet als der 3D-Würfel links.

Abbildung 4b: Das RGB-Farbsystem in einer alternativen Darstellung, die sich für den Vergleich von Farbräumen besser eignet als der 3D-Würfel links.

Profilfrage

Imagemagick unterstützt Farbsysteme, Farbprofile und Farbräume. Besonders beim Zuweisen eines Farbprofils sowie beim Umrechnen eines Bildes in einen anderen Farbraum oder ein anderes Farbsystem ist Verständnis für die Zusammenhänge wichtig.

Gängige Bildformate wie Jpeg und Tiff enthalten neben den Pixelwerten optional auch Meta-Informationen wie Exif-Daten oder Farbprofile. Bei der Nikon-Kamera D80 etwa gibt es keine eingebetteten Profile, aber das Exif-Attribut »Color Space« enthält einen Hinweis. Minoltas A2 legt die Information mal im Attribut »Color Space«, mal in »Color Mode« ab.

Einem Bild ohne eingebettetem Profil kann Imagemagick ein Profil zuweisen (anhängen), ohne die Pixelwerte zu verändern. Besitzt das Bild ein Farbprofil, von dem man weiß, dass es falsch ist, gilt es, dieses Farbprofil zu löschen oder – besser – zu ersetzen, ohne die eigentlichen Pixelwerte zu ändern.

Wer ein Bild in einen anderen Farbraum umrechnen muss, kommt nicht umhin, die Pixelwerte zu ändern. Schwierig daran ist, die Farben beizubehalten, damit ein Hellrot möglichst das gleiche Hellrot im neuen Farbraum bleibt. Neben der reinen Umrechnung ist im Zielbild auch das richtige Farbprofil zu setzen. Für das Ausgangsbild gibt es drei Möglichkeiten: Das Bild hat kein Farbprofil, das Bild hat das falsche Farbprofil oder das Bild hat das richtige Farbprofil.

Klingt nach einer komplexen Angelegenheit. Obwohl Imagemagick dafür mit den Operatoren »-strip«, »-profile« und »+profile« auskommt, ist deren genaue Anwendung nicht gerade trivial. Die Ausgabe des Identify-Kommandos zeigt das vorhandene Profil an:

identify -verbose bild1.tiff

Schneller geht\’s mit Exiftool [6], das zwar nicht zu Imagemagick gehört, aber eine gute Ergänzung darstellt. Der Aufruf »exiftool -profiledescription bild1.tiff« liefert nur die Daten zum Profil.

Recht einfach ist das Löschen der vorhandenen Profile, etwa mit dem Aufruf »convert bild1.tiff -strip bild2.tiff«. Dieser Befehl geht aber etwas zu weit, da er neben dem Farbprofil auch Exif- und/oder IPTC-Profile löscht. Gezielter wirkt das folgende Kommando:

convert bild1.tiff +profile icc bild2.tiff

Hier entfernt Convert nur das ICC-Profil; bei ICM-Profilen geht dies analog mit »+profile icm«. Es ist außerdem auch möglich, das Profil per »convert bild1.tiff profil1.icm« in eine eigene Datei zu exportieren oder ein vorhandenes Profil zu laden: »convert bild1.tiff -profile Profildatei.icm bild2.tiff«

Farbraum konvertieren

An dieser Stelle wird es kompliziert: Der obige Befehl arbeitet unterschiedlich, je nachdem, ob die Eingabedatei schon ein Profil enthält oder nicht. Im ersten Fall weist Imagemagick nicht einfach ein Profil zu, sondern rechnet die Pixelwerte anhand beider Profile um. Um sicherzugehen, sollte man also zuerst ein eventuell vorhandenes Profil löschen und anschließend das gewünschte Profil zuweisen: »convert bild1.tiff +profile icc -profile Profildatei.icm bild2.tiff«. Für die eigentliche Konvertierung ist der Profile-Operator also dreimal anzugeben:

convert bild1.tiff +profile icc -profile Quellprofil.icm -profile Zielprofil.icm bild2.tiff

Das funktioniert allerdings nur, wenn das Quellprofil tatsächlich passt. Wer im Zweifelsfall lieber dem im Bild eingebetteten Profil vertraut, findet im Skript-Schnipsel aus Listing 3 einen Ansatz.

Zudem verfügt Convert über einen »-colorspace«-Operator. Er wandelt ein Bild zwischen verschiedenen Farbsystemen, zum Beispiel in das LAB- oder HSL-System. Recht ungenaue Umwandlungen zwischen RGB und CMYK sind damit auch möglich und angesichts der Komplexität, die die Profile mit sich bringen, mag das für manche Anwendungsfälle die passendere Lösung sein. Unverändert aussehende Farben bleiben aber eher ein Zufallsprodukt [7].

Listing 3: Profile
konvertieren

01 #!/bin/bash
02 
03 QUELL_PROFIL="sRGB.icm"
04 ZIEL_PROFIL="adobeRGB.icm"
05 
06 if convert "$1" "${1%.*}.icm" 2>/dev/null; then
07   # Die Eingabedatei besitzt ein Farbprofil
08   convert "$1" -profile "$ZIEL_PROFIL" "$2"
09   rm -f "${1%.*}.icm"
10 else
11   # Die Eingabedatei hat kein Farbprofil
12   convert "$1" -profile "$QUELL_PROFIL" 
13                -profile "$ZIEL_PROFIL" "$2"
14 fi

Schwarz-Weiß

Graustufenbilder, meist Schwarz-Weiß-Bilder genannt, haben einen besonderen Reiz. Moderne Digitalkameras bieten schon bei der Aufnahme einen Schwarz-Weiß-Modus, allerdings verschenkt der viele kreative Möglichkeiten. Sinnvoller ist es, erst in Farbe zu knipsen und das Foto später am PC zu verwandeln.

Bei Imagemagick führen mehrere Wege zum Ziel, die sich nach Performance und Qualität unterscheiden. Mit einem grauen Farbraumprofil verwandelt man ein Bild wie oben beschrieben per »-profile«-Operator. Analog funktioniert »-colorspace gray«, beide Varianten erzeugen ein echtes Graustufenbild. Eine recht schnelle Variante, die das Farbsystem des Bildes nicht ändert, ist es, die Sättigung aller Farben auf null zu setzen:

convert bild1.tiff -modulate 100,0 bild2.tiff

Der Operator »-modulate Brightness,Saturation,Hue« hat drei Parameter, die in Prozentwerten die Farbbrillanz, Sättigung und den Farbwert bestimmen. Für Schwarz-Weiß bleibt die Helligkeit unverändert auf 100 Prozent, die Sättigung sinkt jedoch auf 0 Prozent. Da kein Wert für den Farbton angegeben ist, bleibt er unverändert.

Farbfilter

Auf diese Weise umgewandelte Bilder entsprechen selten den Erwartungen. Bessere Ergebnisse erhält, wer den Beitrag der einzelnen Farbkanäle (Rot, Grün, Blau) für das Schwarz-Weiß-Bild individuell zusammenmischt. So ist es möglich, klassische Schwarz-Weiß-Filter zu simulieren: Ein Gelbfilter bedient sich zum Beispiel zu 60 Prozent bei Rot, 28 Prozent Grün und 12 Prozent Blau [8]. Das genaue Vorgehen zeigt der übernächste Abschnitt. Um die Mischanteile festzulegen ist es vorher nützlich, die einzelnen Farbkanäle individuell zu betrachten. Imagemagick leistet hierbei gute Dienste. Das Skript in Listing 4 erzeugt ein Vorschaubild mit dem Original und allen Farbkanälen (siehe Abbildung 5).

Listing 4: Farbkanäle
separieren

01 #!/bin/bash
02 
03 convert -gravity South -pointsize 15 "$1" 
04    -resize 512x512 -write mpr:orig 
05    -background white -splice 0x18 
06    -draw "text 0,0 'Original'" 
07    ( mpr:orig -channel red -separate 
08       -background red -splice 0x18 
09       -draw "text 0,0 'Roter Kanal'" 
10    ) +append ( 
11       ( mpr:orig -channel green -separate  
12          -background green -splice 0x18 
13          -draw "text 0,0 'Grüner Kanal'" ) 
14       ( mpr:orig -channel blue  -separate  
15          -background blue -splice 0x18 
16          -draw "text 0,0 'Blauer Kanal'" ) 
17       +append ) 
18    -append "$2"
Abbildung 5: Aus dem Originalfoto links oben separiert Listing 4 die drei Farbkanäle des RGB-Farbsystems und stellt deren jeweilige Helligkeit dar.

Abbildung 5: Aus dem Originalfoto links oben separiert Listing 4 die drei Farbkanäle des RGB-Farbsystems und stellt deren jeweilige Helligkeit dar.

Klammern und Speicherplätze

Wie eingangs schon beschrieben, arbeitet Imagemagick als Stack-basierter Rechner. Die Tools unterstützen aber auch Klammern und benannte Speicherplätze (so genannte Memory Program Register, kurz MPR). In Zeile 3 setzt Listing 4 zwei Optionen für spätere Operatoren und gibt das Quellbild an. Zeile 4 verkleinert es und schreibt das Ergebnis in das MPR-Register »orig«. Dessen Name ist frei wählbar. Das Bild befindet sich aber immer noch auf dem Stack. Die Zeilen 5 und 6 hängen etwas weiße Fläche an (mit dem Operator »-splice«, grob übersetzt mit anflanschen) und beschriften dann das Bild mit »-draw«.

Die Option »-gravity South« aus Zeile 3 wirkt auf »-splice« und auf »-draw«. Damit ist die linke obere Kachel des Vorschaubilds fertig. Ältere Imagemagick-Versionen haben bei der Gravity-Einstellung leider einen Bug: Falls die Texte an der falschen Stelle landen, hilft es, die Gravity-Einstellung vor jedem »-draw« zu wiederholen. Alternativ ist es möglich, sie direkt in das Draw-Kommando zu setzen: »-draw “gravity South text 0,0 \’Roter Kanal\'”«.

Farbkomponente

Die Zeilen 7 bis 9 erzeugen die rechte obere Kachel. Zuerst liest das Skript in Zeile 7 das Original aus dem Register, setzt mit der »-channel«-Option den gewünschten roten Kanal und extrahiert diesen dann mit dem »-separate«-Operator. Die Zeilen 8 und 9 sorgen wieder für die Beschriftung. Das Skript setzt die Operatoren »-separate«, »-splice« und »-draw« in Klammern, um zu verhindern, dass sie auf alle Bilder des Stacks (also auch auf das Original) wirken. Die Schreibweise »(« ist nur der Bash geschuldet.

Zeile 10 fügt die oberen beiden Kacheln per »+append« nebeneinander zusammen. Der Rest ist analog gestrickt: untere linke Kachel (grüner Kanal in Zeilen 11 bis 13), untere rechte Kachel (blauer Kanal in 14 bis 16), horizontal zusammenfügen in Zeile 17 und abschließend in Zeile 18 das vertikale Aneinanderkleben beider Zeilen per »-append«.

Hier sind zwei Klammerebenen notwendig, damit das vorletzte Append nur auf die unteren beiden Bilder wirkt. Das Ganze wirkt komplizierter, als es ist. Wie bei jeder Programmiersprache hilft eine geeignete Einrückung dem Verständnis für Struktur und Logik.

Rohmasse

Für die schnelle Beurteilung eines Raw-Bildes auf dem Bildschirm eignet sich ein Gespann aus dem Skript aus Listing 4 (hier »bwchannel« genannt) und dem bereits erwähnten Exiftool:

exiftool -b -jpgfromraw dsc_2679.nef | bwchannel jpg:- x:

Der Parameter »jpg:-« veranlasst Imagemagick dazu, das Bild im Jpeg-Format von der Standardeingabe zu lesen, und »x:« verwendet die X11-Oberfläche als Ausgabemedium – das Foto erscheint am Bildschirm, nicht in einer Datei. Das klappt wie abgedruckt für Nikons NEF- und Canons CRW-Format. Bei anderen Raw-Formaten heißt das Exif-Tag anders (etwa »-previewimage« für CR2).

Zurück zur qualitativ hochwertigen Umwandlung eines Bildes in Graustufen. Hier gilt es, die einzelnen Kanäle geeignet zu gewichten. Abbildung 5 verrät, dass ein hoher Anteil des Rot-Kanals mit etwas Grün-Beimischung wegen der schönen Wolkenkontraste sinnvoll ist. Wieder gibt es mehrere Wege zum Ziel. Zum Beispiel den mächtigen »-fx«-Operator, der fast beliebige mathematische Ausdrücke erlaubt:

convert baum.tif -fx '0.78*r+0.22*g' baum-bw.tif

Selbst dieser einfache Ausdruck, der den Rot- und den Grün-Kanal gemäß einem klassischen Orange-Filter gewichtet (siehe Abbildung 6), braucht jedoch enorme Rechenleistung, da Imagemagick den Ausdruck für jedes einzelne Pixel interpretiert. Das dauert auf einem Centrino-Rechner mit 1,5 GHz für ein 512 mal 343 Pixel kleines Bild fast 3 Minuten.

Abbildung 6: In diese Schwarz-Weiß-Umwandlung des Originalfotos aus Abbildung 5 ist der rote Farbkanal zu 78 Prozent und der grüne zu 22 Prozent eingeflossen.

Abbildung 6: In diese Schwarz-Weiß-Umwandlung des Originalfotos aus Abbildung 5 ist der rote Farbkanal zu 78 Prozent und der grüne zu 22 Prozent eingeflossen.

Farbwerte ändern

Deutlich schneller, aber weniger mächtig und etwas komplexer in der Anwendung ist der »-evaluate«-Operator (Listing 5). Die »-channel«-Option in den Zeilen 2 bis 4 beschränkt die Wirkung des »-evaluate«-Operators auf den jeweiligen Kanal. Zeile 5 setzt dann die Kanalauswahl zurück, trennt die Kanäle, überlagert diese dann additiv per »-compose add« und vereinigt zum Schluss die Ebenen zum fertigen Bild. Die Laufzeit schrumpft auf weniger als eine Sekunde.

Listing 5: Graustufen mit
»-evaluate«

01 convert baum.tif 
02    -channel R -evaluate multiply 0.78 
03    -channel G -evaluate multiply 0.22 
04    -channel B -evaluate multiply 0.00 
05    +channel -separate -compose add -flatten baum-bw.tif

Bei größeren Bildern merkbar schneller ist aber die dritte Variante. Sie verwendet eine Matrix für die Farbumwandlung als Eingabe für den »-recolor«-Operator (Listing 6). In den einzelnen Spalten stehen dabei die Gewichte für die Kanäle Rot, Grün und Blau. Hat das Bild noch einen Transparenz-Kanal, ist eine 4-mal-4-Matrix nötig.

Listing 6: Graustufen mit
»-recolor«

01 convert baum.tif 
02    -recolor ".78, .22, 0,  
03              .78, .22, 0,  
04              .78, .22, 0"  
05    baum-bw.tif

Mit »-recolor« lassen sich auch in Farbbildern die Farben nachbessern, siehe [9] für die Beschreibung der Technik. Die vielen weiteren Operatoren, etwa »-unsharp« fürs Nachschärfen per unscharfem Maskieren oder »-sigmoidal-contrast« für Kontrastverbesserungen sind auf [3] sehr gut dokumentiert.

Universalwerkzeug

Imagemagick ist ein überaus mächtiges Programmpaket, das zu weit mehr taugt, als nur Bilder zu rotieren und auf Thumbnail-Größe zu verkleinern. Die im Artikel genannten Anwendungen deuten nur an, welche kreativen Möglichkeiten in dem Tool stecken. Die Lernkurve erscheint nur auf den ersten Blick steil, denn Imagemagick begnügt sich mit wenigen strukturellen Syntaxelementen, die schnell verinnerlicht sind. Was bleibt, ist ein umfangreicher Zoo an Operatoren, viele gehören aber zu den Exoten. Für die meisten Aufgaben genügen einige wenige Anweisungen. (fjl)

Infos

[1] Imagemagick: [http://www.imagemagick.org]

[2] Tim Schürmann, “Pixelzauber – Bildbearbeitung auf der Konsole”: LinuxUser 02/08, S. 40

[3] Beispielsammlung für Imagemagick: [http://www.imagemagick.org/Usage/]

[4] Mailinglisten: [http://www.imagemagick.org/discourse-server/]

[5] Filter zur Größenänderung: [http://www.imagemagick.org/Usage/resize/#filter]

[6] Exiftool: [http://owl.phy.queensu.ca/~phil/exiftool/]

[7] Achim Leitner, “Farb(t)raum – CMYK-Bilder mit Imagemagick in RGB umwandeln”: Linux-Magazin 01/08, S. 55

[8] Simulation klassischer SW-Filter: [http://www.outbackphoto.com/artof_b_w/bw_01/essay4.html]

[9] Digital Velvia, simuliert Fuji-Velvia-Film: [http://www.reflectiveimages.com/digitalvelvia.htm]

Der Autor

Bernhard Bablok betreut bei Allianz Shared Infrastructure Services ein großes Datawarehouse mit technischen Performance-Messdaten von Mainframes bis zu Servern. Wenn er nicht Musik hört, mit dem Rad oder zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Linux und Objektorientierung.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben