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.size
和arr2im.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)