Stranger Than Usual

Mit Imagemagick eine Farbpalette aus Bildern extrahieren

Ich brauche für ein kleines anderes Projekt (dazu in einem späteren Post mehr) eine Palette von allen Farben, die in einer Sammlung von Bildern vorkommen. Hier kann mal wieder das Schweizertaschenmesser der Bildverarbeitung glänzen: Imagemagick. Um eine Farbpalette aus einem Bild herauszukriegen, kann man folgenden Befehl ausführen:

magick bild.png -unique-colors palette.png

Das erstellt ein Bild mit einer Höhe von einem Pixel und so breit, wie die Anzahl der Farben ist. Jedes Pixel hat ein der Farben, die in dem Ursprungsbild vorkamen, alle Farben tauchen in dem Ausgabebild auf.

Man kann sich die Farben auch in einer Textdatei ausgeben lassen

magick all.png -unique-colors txt:palette.txt

Der halbe Weg ist also geschafft. Ich will aber nicht die Palette eines Bildes, sondern die Palette mehrerer Bilder zusammen. Wenn ich mehrere Eingabedateien angebe, erstellt mir Imagemagick hier aber einfach eine Palette pro Datei. Das reicht also nicht. Ich habe ein bisschen herumgesucht, und bin nur auf einen Workaround gekommen: Ich füge erst alle Bilder zu einer Bilddatei zusammen und nehme dann die Palette dieses Gesamtbildes. Das Zusammenfügen kann man z.B. so machen:

convert -append img/* all.png

Wobei in diesem Fall die Eingabedateien unter img liegen und all.png die Ausgabedatei ist. Eine wichtige Einschränkung: Wenn die Eingabebilder nicht alle gleich groß sind, wird es weiße Flächen in all.png geben. Das heißt, es wird eventuell weiß zur Palette hinzugefügt, obwohl das falsch wäre. In meinem Fall war aber weiß ohnehin Teil der Palette. Ansonsten kann man Imagemagick sicher auch irgendwie dazu bringen, den Hintergrund anders zu färben.

Damit jedenfalls habe ich meine Palette:

Ein sehr kleines Bild, auf dem man kaum etwas erkennen kann.

Oh, warte, das kann man kaum sehen. Also hier eine vergrößerte Variante:

16 Farben, von schwarz nach weiß über rot, grün und blau.

Und hier die Textausgabe:

# ImageMagick pixel enumeration: 16,1,0,255,srgb
0,0: (0,0,0)  #000000  black
1,0: (128,0,0)  #800000  maroon
2,0: (255,0,0)  #FF0000  red
3,0: (0,128,0)  #008000  green
4,0: (0,255,0)  #00FF00  lime
5,0: (128,128,0)  #808000  olive
6,0: (255,255,0)  #FFFF00  yellow
7,0: (0,0,128)  #000080  navy
8,0: (0,0,255)  #0000FF  blue
9,0: (128,0,128)  #800080  purple
10,0: (255,0,255)  #FF00FF  magenta
11,0: (0,128,128)  #008080  teal
12,0: (0,255,255)  #00FFFF  cyan
13,0: (128,128,128)  #808080  fractal
14,0: (192,192,192)  #C0C0C0  silver
15,0: (255,255,255)  #FFFFFF  white