web-dev-qa-db-fra.com

La conversion entre l’objet Pillow Image et le tableau numpy change de dimension

J'utilise Pillow et Numpy, mais j'ai un problème de conversion entre l'objet Pillow Image et le tableau Numpy.

quand j'exécute le code suivant, le résultat est bizarre.

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

le résultat est 

(1024, 768)
(768, 1024)

Pourquoi la dimension est changée? 

23
Jongsu Liam Kim

im peut-être la colonne majeure alors que les tableaux dans numpy sont en rangée principale

faire in_data = in_data.T pour transposer le tableau python

devrait probablement vérifier in_data avec matplotlib's imshow pour s’assurer que l’image est correcte.

Mais savez-vous que matplotlib est livré avec ses propres fonctions de chargement qui vous donnent directement des tableaux numpy? Voir: http://matplotlib.org/users/image_tutorial.html

16
prgao

Si votre image est en niveaux de gris, faites:

in_data = in_data.T

mais si vous travaillez avec des images rbg, vous voulez vous assurer que votre opération de transposition ne se fait que sur deux axes:

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

en fait, c'est parce que la plupart des bibliothèques d'images vous donnent des images transpozées par rapport aux tableaux numpy. c'est (je pense) que vous écrivez des fichiers image ligne par ligne, donc le premier index (disons x) fait référence au numéro de ligne (donc x est l'axe vertical) et le deuxième index (y) fait référence au pixel suivant ligne (donc y est l’axe horizontal), ce qui va à l’encontre de nos coordonnées quotidiennes.

Si vous voulez le gérer correctement, vous devez vous rappeler d'écrire:

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

et par conséquent:

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

Ce qui fonctionne aussi pour les images 3D. Mais je ne promets pas que c'est le cas de TOUTES les bibliothèques d'images - seulement de celles avec lesquelles j'ai travaillé.

0
Śmigło