it-swarm.com.de

Die Konvertierung zwischen dem Pillow-Image-Objekt und dem Numpy-Array ändert die Dimension

Ich verwende Pillow und numpy, habe aber ein Problem mit der Konvertierung zwischen dem Pillow Image-Objekt und dem numpy-Array.

wenn ich folgenden Code ausführen, ist das Ergebnis komisch.

im = Image.open(os.path.join(self.img_path, ifname))
print im.size
in_data = np.asarray(im, dtype=np.uint8)
print in_data.shape

ergebnis ist 

(1024, 768)
(768, 1024)

Warum wird die Dimension geändert? 

23
Jongsu Liam Kim

ich bin vielleicht column-major, während Arrays in numpy row-major sind

do in_data = in_data.T, um das Python-Array zu transponieren

in_data sollte wahrscheinlich mit matplotlibs imshow überprüft werden, um sicherzustellen, dass das Bild richtig aussieht.

Aber wissen Sie, dass Matplotlib über eigene Ladefunktionen verfügt, mit denen Sie direkt numpy Arrays erhalten können? Siehe: http://matplotlib.org/users/image_tutorial.html

16
prgao

Wenn Ihr Bild Graustufen ist, machen Sie Folgendes:

in_data = in_data.T

wenn Sie jedoch mit rbg-Bildern arbeiten, möchten Sie sicherstellen, dass Ihre Transponierungsoperation nur auf zwei Achsen erfolgt:

in_data = np.transpose(in_data, (1,0,2))
5
Nathan Harmon

dies liegt eigentlich daran, dass die meisten Bildbibliotheken Bilder enthalten, die gegenüber numpy-Arrays transponiert sind. Dies ist (denke ich), weil Sie Bilddateien zeilenweise schreiben. Der erste Index (sagen wir x) bezieht sich auf die Zeilennummer (also x ist die vertikale Achse) und der zweite Index (y) bezieht sich auf das nachfolgende Pixel in Linie (also y ist die horizontale Achse), was gegen unseren Alltagskoordinaten Sinn ist.

Wenn Sie richtig damit umgehen wollen, müssen Sie daran denken, zu schreiben:

image = library.LoadImage(path)
array = (library.FromImageToNumpyArray(image)).T

und folglich:

image = library.FromNumpyArrayToImage(array.T)
library.WriteImage(image, path)

Was auch für 3D-Bilder funktioniert. Aber ich verspreche nicht, dass dies für ALLE Bildbibliotheken der Fall ist - nur mit denen ich gearbeitet habe.

0
Śmigło