RGB-Farberwerte aus einen tif-Bild auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Albert
User
Beiträge: 23
Registriert: Montag 29. Oktober 2007, 09:42

Hallo Forum,

ich möchte mir aus einen tif-Bild alle verschiedenen RGB-Farben auslesen

>>> im = Image.open("C:\karte.tif")
>>> print im.format, im.size, im.mode
TIFF (8937, 7645) P

>>> color = im.getcolors()

Nun bekomme ich eine Liste mit 256 Einträgen, die z.B. so aussieht:
>>> print color
[(38715, 0), (509781, 1), (35277889, 2), (17136403, 3), (3052480, 4), (1983178, 5), (288, 6), (343, 7), (328, 8), (300, 9), (2196, 10),........................]

Der erste Wert zeigt an, wie oft der Farbwert vorkommt. Der zweite Wert gibt den Wert in der Image Palette an. In dieser Image Palette stehen die RGB Werte.

Jetzt weiß ich leider nicht, welche Farben den RGB-Werten der einzelnen Einträge in meiner Liste „color“ zugeordnet sind?
Ich denke, man findet es heraus mit „im.palette.getcolor“ oder so?

Kann mir einer sagen, wie ich die RGB-Farbwerte herausbekomme?

Vielen Dank für eure Hilfe

Albert
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi und willkommen im Forum,
Albert hat geschrieben: Kann mir einer sagen, wie ich die RGB-Farbwerte herausbekomme?
gar nicht, denn Dein Bild ist hat keine RGB-Werte: http://www.pythonware.com/library/pil/h ... ncepts.htm
(im.mode ist nicht 'RGB'!)
Wenn doch, kannst Du die Werte aber wahrscheinlich nicht mit getcolors() abfragen, weil das zuviel Speicher verbraucht. Die Doku schlägt den Umweg über getdata() vor, z. B.:

Code: Alles auswählen

colortriplets = [triplet for triplet in im.getdata()]
Wobei das speichermäßig unter Umständen auch keine gute Idee ist, aber ich hoffe Du siehst, wie man ggf. über die triplets iterieren kann.

Gruß,
Christian

edit: Klarstellung am Ende zugefügt.
BlackJack

Natürlich hat das Bild RGB-Werte. Nur halt indirekt über eine Palette.

Die bekommt man mit `getpalette()` vom Bild, leider als "flache" Liste, man muss sich das RGB-Triple da also heraus"slicen".

Code: Alles auswählen

In [202]: color = img.getpixel((100,100))

In [203]: palette = img.getpalette()

In [204]: palette[color * 3:color * 3 + 3]
Out[204]: [65, 91, 140]
Albert
User
Beiträge: 23
Registriert: Montag 29. Oktober 2007, 09:42

Hi,
erst mal Danke für eure schnelle Antwort.
Also, ich weiß doch, wie viele Farben in der Palette sind.
In meinem Fall sind es 256.

Code: Alles auswählen

>>> len(filter(None, im.histogram()))
>>> 256
So jetzt möchte ich erst einmal zu jedem Palettenwert den gewünschten Farbwert haben, z.B. Palettenwert 213 hat den RGB-Wert 24, 54, 231.

Das müsste doch einfacher gehen, als mir für jeden Pixel den RGB-Wert ausgeben zu lassen. Oder hab ich euch da falsch verstanden?

Danke für eure Hilfe

Grüße Albert
BlackJack

Die Palette bekommst Du mit `getpalette()`. Wenn Du nur die haben willst, musst Du natürlich nicht jedes Pixel anschauen.

Es kann natürlich sein, dass die Palette Farben enthält, die gar nicht im Bild verwendet werden. Dann müsstest Du schon mit dem Histogramm arbeiten.
Albert
User
Beiträge: 23
Registriert: Montag 29. Oktober 2007, 09:42

Ok, hab mich wohl oben etwas falsch ausgedrückt (sorry).
Also, wenn ich "getpalette()" benutzte, bekomme ich eine Liste, die dann so aussieht.

Code: Alles auswählen

>>> palette= im.getpalette()
>>> palette
[0, 0, 0, 255, 255, 255, 254, 254, 254, 253, 251, 105, 253, 213, 105, 151, 71, 73, 199, 84, 85, 183, 80, 81, 168, 76, 77, 202, 112, 114, 166, 93, 94, 177, 117, 118, 200, 140, 141, 208, 97, 102, 157, 80, 82, 170, 105, 107, 190, 126, 128, 148, 86, 90, 230, 211, 212, 179, 102, 110, 244, 203, 207, 147, 74, 89, 198, 59, 95, 145, 106, 119, 189, 64,.....]
>>>
>>> len(palette)
768
Die Länge meiner "paletten"-Liste ist 768. Ich nehme mal an, dass immer drei Werte zusammen gehören. Somit komme ich ja dann auch auf meine 256 Farben, wie ich oben dem Histogramm entnehmen konnte.

Jetzt habe ich in meiner Liste „palette“ einzelne Farbwerte. Aber wie soll ich jetzt den Palettenwert XY den verschiedenen RGB-Werten zuordnen?
Kannst du mir vielleicht bitte zeigen, wie das gehen soll? :?

Das wäre echt nett.

Grüße Albert
BlackJack

Falls ich die Frage richtig verstanden habe, gab's die Antwort schon: Farbindex mit 3 multiplizieren und ab dem Index dann drei Werte aus der Palettenliste holen.

Wenn Du das oft mit einer Palette machen musst, lohnt es sich vielleicht die RGB-Werte in der Liste zu gruppieren.

Code: Alles auswählen

In [262]: palette = range(768)

In [263]: it = iter(palette)

In [264]: rgbs = zip(it, it, it)

In [265]: rgbs[:5]
Out[265]: [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Wohl langsamer, aber eine Zeile kürzer:

Code: Alles auswählen

>>> palette=range(768)
>>> rgbs=zip(palette[::3], palette[1::3], palette[2::3])
>>> rgbs[:5]
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]
MfG
HWK
BlackJack

Ich bin gerade in "Perl-Laune":

Code: Alles auswählen

In [268]: rgbs = (lambda it=iter(palette): zip(it, it, it))()

In [269]: rgbs[:5]
Out[269]: [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]
;-)
Albert
User
Beiträge: 23
Registriert: Montag 29. Oktober 2007, 09:42

Hi,

ok, glaub jetzt hab ich es endlich verstanden! Und es funktiert jetzt auch.

Vielen Dank für eure Hilfe

Gruß Albert
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

BlackJack hat geschrieben:Ich bin gerade in "Perl-Laune":
Okay, okay. Gebe mich geschlagen.
Antworten