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, , (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
RGB-Farberwerte aus einen tif-Bild auslesen
Hoi und willkommen im Forum,
(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.:
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.
gar nicht, denn Dein Bild ist hat keine RGB-Werte: http://www.pythonware.com/library/pil/h ... ncepts.htmAlbert hat geschrieben: Kann mir einer sagen, wie ich die RGB-Farbwerte herausbekomme?
(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()]
Gruß,
Christian
edit: Klarstellung am Ende zugefügt.
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".
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]
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.
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
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
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
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.
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.
Ok, hab mich wohl oben etwas falsch ausgedrückt (sorry).
Also, wenn ich "getpalette()" benutzte, bekomme ich eine Liste, die dann so aussieht.
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
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
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
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.
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)]
Wohl langsamer, aber eine Zeile kürzer:MfG
HWK
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)]
HWK
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)]