469 votes

PIL et numpy

Très bien, je suis toying autour de avec la conversion d'une image de PIL objet d'avant en arrière pour un tableau numpy afin que je puisse faire une plus rapide pixel par pixel transformations de PIL est PixelAccess objet permettrait. J'ai compris comment placer le pixel utile l'information 3D tableau numpy par:

pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

Mais je n'arrive pas à trouver comment charger de nouveau dans le PIL objet après j'ai fait tous mes génial transforme. Je suis conscient de la putdata() la méthode, mais ne peuvent pas sembler obtenir assez de se comporter.

Toutes les pensées?

460voto

dF. Points 29787

Vous ne dites pas comment exactement, putdata() n'est pas satisfaisante. Je suis en supposant que vous êtes en train de faire

>>> pic.putdata(a)
Traceback (most recent call last):
  File "...blablabla.../PIL/Image.py", line 1185, in putdata
    self.im.putdata(data, scale, offset)
SystemError: new style getargs format but argument is not a tuple

C'est parce qu' putdata s'attend à une séquence de n-uplets et vous êtes en lui donnant un tableau numpy. Cette

>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)

va fonctionner, mais il est très lent.

Comme de PIL 1.1.6, la "bonne" façon de convertir entre les images et les tableaux numpy est tout simplement

>>> pix = numpy.array(pic)

bien que le tableau est dans un format différent du vôtre (3-d de tableau ou de lignes/colonnes/rvb dans ce cas).

Puis, après vous apportez vos modifications dans le tableau, vous devriez être en mesure de faire les deux pic.putdata(pix) ou créer une nouvelle image avec Image.fromarray(pix).

349voto

endolith Points 4183

Ouvert, j'ai comme un tableau:

>>> I = numpy.asarray(Image.open('test.jpg'))

Faire des trucs pour moi, ensuite, de convertir une image:

>>> im = Image.fromarray(numpy.uint8(I))

Filtre numpy images avec la FFT, Python

Si vous voulez le faire explicitement pour une raison quelconque, il y a pil2array() et array2pil() des fonctions à l'aide getdata() sur cette page en correlation.zip.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X