2013-09-25 10 views
20

Ich benutze Pillow und numpy, aber ein Problem mit der Konvertierung zwischen Pillow Image Objekt und numpy Array.Konvertierung zwischen Pillow Image Objekt und numpy Array ändert Dimension

Wenn ich folgenden Code ausführen, ist das Ergebnis seltsam.

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 Dimension geändert wird?

Antwort

16

im vielleicht Spalte-Dur während Arrays in numpy sind row-Dur

in_data = in_data.T tun dem Python-Array

wahrscheinlich umsetzen sollte imshow um sicherzustellen, dass das Bild richtig aussieht IN_DATA mit matplotlib ‚s überprüfen.

Wissen Sie aber, dass Matplotlib mit eigenen Ladefunktionen ausgestattet ist, die Ihnen direkt Arrays zur Verfügung stellen? Siehe: http://matplotlib.org/users/image_tutorial.html

+0

'np.asarray (im, order = 'F')' ist auch [möglich] (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.asarray.html # numpy.asarray) –

5

Wenn Ihr Bild Graustufen-do ist:

in_data = in_data.T 

aber wenn Sie mit rbg Bildern arbeiten wollen Sie sicherstellen, dass Ihre Transponierung nur entlang zwei Achsen ist:

in_data = np.transpose(in_data, (1,0,2)) 
0

Dies liegt daran, dass die meisten Bildbibliotheken Ihnen Bilder liefern, die im Vergleich zu numpligen Arrays transpoziert werden. Dies ist (glaube ich), weil Sie Bilddateien zeilenweise schreiben, also bezieht sich der erste Index (sagen wir x) auf die Zeilennummer (also x ist die vertikale Achse) und der zweite Index (y) bezieht sich auf das nachfolgende Pixel in Linie (so y ist die horizontale Achse), die gegen unsere alltäglichen Koordinaten Sinn ist.

Wenn Sie damit umgehen wollen korrekt läuft, 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) 

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