Bild in Liste von Pixeln konvertieren Python?
Hallo,
ich stecke bei folgender Aufgabe fest und würde mich sehr freuen, wenn mir jemand weiterhelfen kann:
ich soll eine Funktion schreiben, die ein Bild als dreidimensionales Array übergeben bekommt (der Form [Zeile, Spalte, RGB] mit Abmessungen (ymax, xmax, 3) und dem Elementtyp uint8).
Dieses Bild soll dann in eine Liste von Pixeln umgewandelt werden, dabei soll jedes Pixel als (R, G, B, X, Y)-Tupel dargestellt werden und die Pixel sollen zeilenweise in der zurückgegebenen Liste liegen.
Ich bedanke mich schonmal im voraus für jede Hilfe,
viele Grüße, bamu
1 Antwort
Ich habe noch nicht genau verstanden, wie das dreidimensionale Array aussehen soll. Kannst du da mal ein Beispiel geben. Also beispielsweise vielleicht für sowas...
Das Ergebnis soll hier wohl so aussehen:
[(255, 0, 0, 0, 0), (0, 0, 255, 0, 1), (255, 255, 0, 0, 2),
(0, 255, 255, 1, 0), (255, 127, 0, 1, 1), (127, 127, 127, 1, 2)]
Sehe ich das richtig?
======Ergänzung======
Ah. Ich habe nicht richtig nachgedacht. Ja, ich glaube, ich weiß wie das dreidimensionale Array aussehen soll.
Im konkreten Beispiel wäre es wohl einfach...
ymax = 2
xmax = 3
A = [[[255, 0, 0], [ 0, 0, 255], [255, 255, 0]],
[[ 0, 255, 255], [255, 127, 0], [127, 127, 127]]]
(Aus irgendeinem Grund dachte ich zunächst, das wäre ein zweidimensionales Array und war verwirrt. Aber klar. Es ist ein dreidimensionales Array.)
L = [tuple(A[y][x][i] for i in range(3))+(x, y) for y in range(ymax) for x in range(xmax)]

Ich habe meine Antwort entsprechend ergänzt. Ich würde vorschlagen...
def imageToPixels(A):
ymax = len(A)
xmax = len(A[0])
return([tuple(A[y][x][i] for i in range(3))+(x, y)
for y in range(ymax) for x in range(xmax)])
beispiel_array = [[[255, 0, 0], [0, 255, 0], [0, 0, 255]]]
beispiel_liste = imageToPixels(beispiel_array)
print(beispiel_liste)
Ich weiß nicht, was für ein Modul du für die Arrays nutzt. In Python ist schließlich standardmäßig kein array-Funktion definiert. Aber das sollte wahrscheinlich auch genauso mit deinen Arrays funktionieren.
Bemerkung dazu, was da passiert...
Ich gehe in einer List-Comprehension (wobei quasi mit einer for-Schleife, eine entsprechende Liste erzeugt wir) jede Zeile y und jede Spalte x durch. Darin besorge ich mir jeweils mit tuple(A[y][x][i] for i in range(3)) ein Tupel der entsprechenden RGB-Werte an dieser Position und verkette das mit dem Tupel (x, y) zu einem gewünschten 5er-Tupel. Die List-Comprehension liefert mir dann die Liste für die Rückgabe.
Zu Beginn besorge ich mir xmax und ymax über entsprechende Listenlängen.
Wenn man möchte, könnte man statt tuple(A[y][x][i] for i in range(3)) auch ausgeschrieben (A[y][x][0], A[y][x][1], A[y][x][2]) verwenden...
def imageToPixels(A):
ymax = len(A)
xmax = len(A[0])
return([(A[y][x][0], A[y][x][1], A[y][x][2], x, y)
for y in range(ymax) for x in range(xmax)])
beispiel_array = [[[255, 0, 0], [0, 255, 0], [0, 0, 255]]]
beispiel_liste = imageToPixels(beispiel_array)
print(beispiel_liste)
Vielen Dank für die Antwort!
Ja, genau nach diesem Schema soll das funktionieren. Ein Beispiel für den Funktionsaufruf wäre:
imageToPixels (array([[[255, 0, 0],
[0, 255, 0],
[0, 0, 255]]], dtype=uint8))
und der Rückgabewert wäre dafür [(255, 0, 0, 0, 0), (0, 255, 0, 1, 0), (0, 0, 255, 2, 0)]
Stehe da leider gerade völlig auf dem Schlauch, wie ich das machen kann...