Seite 1 von 1
PIL und Palette-Mode Images
Verfasst: Montag 18. Januar 2010, 18:34
von Defnull
Ich habe ein RGB Bild und möchte die Farben auf eine fest definierte Palette reduzieren, aber so, das möglichst passende Farben gewählt werden. Im Idealfall sollen Farben der Palette in einem begrenzten Rahmen sogar gemischt werden, um näher am Input-Bild zu sein. Hat die Palette z.B. nur Gelb und Blau, aber kein Grün, soll ein grüner Bereich im Startbild mit einem gelb-blauen Raster überlagert werden.
Ist das mit PIL möglich? Gibts dafür fertige Filter? (Hab dazu nichts in der Doku gefunden). Und wenn nicht, hat jemand ein paar Stichworte für einen guten Algorithmus, der das macht?
Verfasst: Montag 18. Januar 2010, 19:46
von HWK
Hast Du es schon mal mit im.putpalette und im.convert (mode "P") versucht?
MfG
HWK
Verfasst: Montag 18. Januar 2010, 23:40
von Defnull
Da kann man nur bei Graustufen-Bildern eine Palette vor geben.
Ich hab Floyd–Steinberg dithering implementiert, das funktioniert ganz gut. Ist nur langsam, da ich die Pixel-Schieberei in Python und nicht in C machen muss.
Verfasst: Dienstag 19. Januar 2010, 14:05
von HWK
In PILs Image.py befindet sich eine Methode quantize, der man ein Referenzbild für eine Palette übergeben kann. Vielleicht probierst Du es damit einmal aus.
P.S.: Hab' dazu gerade noch
das hier gefunden.
MfG
HWK
Verfasst: Mittwoch 20. Januar 2010, 13:17
von HWK
Ich habe jetzt das verlinkte Snippet mit quantize einmal ausprobiert. Das Ergebnis ist ansehnlich und m.E. schnell.
@defnull: Hast Du das Tempo mal mit Deinem selbstgestrickten Code verglichen?
MfG
HWK
Verfasst: Freitag 22. Januar 2010, 19:47
von Defnull
Ja, so klappt es. Das ist nicht gerade intuitiv oder gut dokumentiert, muss ich sagen
Klar, die PIL Variante ist deutlich schneller als meine Python Variante. Etwa Faktor 10 bei 500x500 pixel großen Bildern.