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?
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
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))
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é.