好吧,我可以允许'm toying around with converting a PIL image object back and forth to a numpy array so I can do some faster pixel by pixel transformations than PIL' s PixelAccess
对象 . 我已经想出如何通过以下方式将像素信息放在一个有用的3D numpy数组中:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
但是我可以完成所有令人敬畏的变换 . 我知道 putdata() 方法,但似乎无法让它表现出来 .
5 回答
你不是说
putdata()
究竟是怎么回事 . 我'm assuming you'在做这是因为
putdata
期望一系列元组,并且你给它一个numpy数组 . 这个会工作,但它很慢 .
从PIL 1.1.6开始,"proper" way to convert between images and numpy arrays就是简单的
虽然生成的数组格式与您的格式不同(在这种情况下为3-d数组或行/列/ rgb) .
然后,在对数组进行更改后,您应该能够
pic.putdata(pix)
或使用Image.fromarray(pix)
创建新图像 .打开
I
作为数组:做一些东西到
I
,然后,将其转换回图像:Filter numpy images with FFT, Python
如果由于某种原因想要显式地执行它,则在correlation.zip中使用this page上的getdata()函数有pil2array()和array2pil()函数 .
我在Python 3.5中使用Pillow 4.1.1(PIL的后继者) . 枕头和numpy之间的转换很简单 .
需要注意的一件事是Pillow风格的
im
是列专业,而numpy风格的im2arr
是行专业 . 但是,函数Image.fromarray
已经考虑到了这一点 . 也就是说,上例中的arr2im.size == im.size
和arr2im.mode == im.mode
.在处理转换后的numpy数组时,我们应该处理HxWxC数据格式,例如:将
im2arr = np.rollaxis(im2arr, 2, 0)
或im2arr = np.transpose(im2arr, (2, 0, 1))
转换为CxHxW格式 .您需要以这种方式将图像转换为numpy数组:
我今天使用的例子: