D'accord, je joue avec la conversion d'un objet image PIL d'avant en arrière en un tableau numpy afin que je puisse faire des transformations pixel par pixel plus rapidement que l' PixelAccess
objet PIL ne le permettrait. J'ai compris comment placer les informations sur les pixels dans un tableau numpy 3D utile au moyen de:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Mais je n'arrive pas à comprendre comment le recharger dans l'objet PIL après avoir fait toutes mes transformations impressionnantes. Je connais la putdata()
méthode, mais je n'arrive pas vraiment à la faire se comporter.
pic.size[0]
etpic.size[1]
doivent être échangés (c.-à-d.reshape(pic.size[1], pic.size[0], 3)
), Puisquesize
estwidth x height
oux * y
, tandis que l'ordre matriciel estrows x columns
.Réponses:
Vous ne dites pas comment
putdata()
ne se comporte pas exactement . Je suppose que tu faisEn effet,
putdata
attend une séquence de tuples et vous lui donnez un tableau numpy. Cefonctionnera mais il est très lent.
Depuis PIL 1.1.6, la manière "correcte" de convertir entre les images et les tableaux numpy est simplement
bien que le tableau résultant soit dans un format différent du vôtre (tableau 3D ou lignes / colonnes / RVB dans ce cas).
Ensuite, après avoir apporté vos modifications au tableau, vous devriez pouvoir faire l'une
pic.putdata(pix)
ou l' autre ou créer une nouvelle image avecImage.fromarray(pix)
.la source
Image.fromarray
n'est pas répertorié dans la documentation PIL (!) Donc je ne l'aurais jamais trouvé s'il n'y avait pas eu cela.numpy.asarray(pic)
n'est pas la bonne façon de convertirnumpy.array(pic)
. Selon cette réponsearray
, une copieasarray
sera effectuée, mais pas (mais leasarray
résultat sera en lecture seule).Ouvrir en
I
tant que tableau:Faites quelques trucs pour
I
ensuite le reconvertir en image:Filtrer les images numpy avec FFT, Python
Si vous voulez le faire explicitement pour une raison quelconque, il existe des fonctions pil2array () et array2pil () utilisant getdata () sur cette page dans correlation.zip.
la source
import Image
abord fait? Avez-vous installé PIL?uint8
conversion est-elle nécessaire?numpy.asarray(Image.open(filename))
semble fonctionner pour les images .jpg mais pas pour .png. Le résultat s'affiche sous la formearray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Il ne semble pas y avoir de méthode nommée de manière évidentePngImagePlugin.PngImageFile
pour résoudre ce problème. Je suppose que je devrais poser cette question comme une nouvelle question, mais elle est très pertinente pour ce fil. Quelqu'un comprend-il ce qui ne va pas ici?getdata()
retourne une séquence comme un objet ( pillow.readthedocs.io/en/3.4.x/reference/… ), mais une image d'oreiller implémente celle__array_interface__
quinumpy
peut être utilisée pour accéder aux octets bruts d'une image sans avoir à passer par un itérateur (voir github.com/python-pillow/Pillow/blob/… et docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Vous pouvez même simplement utilisernumpy.array(PIL.Image.open('test.jpg'))
J'utilise Pillow 4.1.1 (le successeur de PIL) dans Python 3.5. La conversion entre Pillow et numpy est simple.
Une chose qui doit être notée est que le style oreiller
im
est majeur sur colonne tandis que le style numpyim2arr
est majeur sur ligne. Cependant, la fonctionImage.fromarray
prend déjà cela en considération. C'est-à-dire,arr2im.size == im.size
etarr2im.mode == im.mode
dans l'exemple ci-dessus.Nous devons prendre soin du format de données HxWxC lors du traitement des tableaux numpy transformés, par exemple faire la transformation
im2arr = np.rollaxis(im2arr, 2, 0)
ouim2arr = np.transpose(im2arr, (2, 0, 1))
au format CxHxW.la source
np.flipud
correction. Bien que mon image PIL ait été créée à partir de zéro en utilisantImageDraw.Draw
. Je pense qu'il faut faire attention d'où vient l'origine de leurs coordonnées.Vous devez convertir votre image en un tableau numpy de cette façon:
la source
.convert("L")
par.convert("RGB")
L'exemple que j'ai utilisé aujourd'hui:
la source
Si votre image est stockée au format Blob (c'est-à-dire dans une base de données), vous pouvez utiliser la même technique expliquée par Billal Begueradj pour convertir votre image de Blobs en un tableau d'octets.
Dans mon cas, j'avais besoin que mes images soient stockées dans une colonne blob dans une table db:
J'ai ensuite créé une fonction d'aide pour changer mon jeu de données en np.array:
Après cela, j'ai pu utiliser les byteArrays dans mon réseau de neurones.
la source
Convertir l'
Numpy to PIL
image etPIL to Numpy
la source
Vous pouvez transformer l'image en numpy en analysant l'image en fonction numpy () après avoir éliminé les fonctionnalités (dé-normalisation)
la source