Bild in Liste von Pixeln konvertieren Python?

1 Antwort

Von Experte ralphdieter bestätigt

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...

Bild zum Beitrag

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)]
 - (Computer, programmieren, Informatik)
bamu1234 
Fragesteller
 18.06.2022, 17:00

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...

0
mihisu  18.06.2022, 17:11
@bamu1234

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.

0
mihisu  18.06.2022, 17:18
@mihisu

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.

0
bamu1234 
Fragesteller
 18.06.2022, 17:20
@mihisu

Ein riesiges Dankeschön! Jetzt funktioniert es :)

1
mihisu  18.06.2022, 17:22
@mihisu

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)
0
ralphdieter  18.06.2022, 20:27
@mihisu

oder noch einfacher

return [(*A[y][x], x, y) 
        for y in range(ymax)
    for x in range(xmax)] 
1