PIL和numpy

好吧,我正忙着将一个PIL图像对象来回转换为一个numpy数组,所以我可以比PIL的PixelAccess对象允许更快的逐像素转换。 我已经想出了如何通过以下方式将像素信息放置在有用的3D numpy数组中:

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

但我似乎无法弄清楚如何完成我所有的真棒转换后,将其加载回PIL对象。 我知道putdata()方法,但似乎不能让它的行为。

有什么想法吗?

你不是说putdata()是不是行为。 我假设你在做

 >>> 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 

这是因为putdata需要一系列的元组,并且给它一个numpy数组。 这个

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

会起作用,但速度很慢。

从PIL 1.1.6开始, 在图像和numpy数组之间进行转换的“正确”方法就简单了

 >>> pix = numpy.array(pic) 

虽然结果数组的格式与您的不同(在这种情况下是3-d数组或rows / columns / rgb)。

然后,在对数组进行更改之后,您应该可以执行pic.putdata(pix)或使用pic.putdata(pix)创build新图像。

打开I作为一个数组:

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

做一些东西给I ,然后,把它转换回一个形象:

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

用FFT,Python过滤numpy图像

如果由于某种原因需要明确地执行此操作,那么在correlation.zip的这个页面上使用getdata()函数会有pil2array()和array2pil()函数。

你需要把你的图像转换成一个numpy数组:

 import numpy import PIL img = PIL.Image.open("foo.jpg").convert("L") imgarr = numpy.array(img) 

我在Python 3.5中使用Pillow 4.1.1(PIL的inheritance者)。 枕头和numpy之间的转换很简单。

 from PIL import Image import numpy as np im = Image.open('1.jpg') im2arr = np.array(im) # im2arr.shape: height x width x channel arr2im = Image.fromarray(im2arr) 

有一点需要注意的是枕头式的im专栏式,而numpy式的im2arr则是行式的专业。 但是,函数Image.fromarray已经考虑到了这一点。 就是上面例子中的arr2im.size == im.sizearr2im.mode == im.mode

在处理转换的numpy数组时,我们应该注意处理差异,比如做im2arr = np.rollaxis(im2arr, 2, 0)或者im2arr = np.transpose(im2arr, (2, 0, 1))

我今天使用的例子是:

 import PIL import numpy from PIL import Image def resize_image(numpy_array_image, new_height): # convert nympy array image to PIL.Image image = Image.fromarray(numpy.uint8(numpy_array_image)) old_width = float(image.size[0]) old_height = float(image.size[1]) ratio = float( new_height / old_height) new_width = int(old_width * ratio) image = image.resize((new_width, new_height), PIL.Image.ANTIALIAS) # convert PIL.Image into nympy array back again return array(image)