好吧,我想将PIL图像对象来回转换为numpy数组,因此我可以实现比PIL PixelAccess对象所允许的更快的逐像素转换。我想出了如何通过以下方式将像素信息放置在有用的3D numpy数组中:
PIL PixelAccess
pic = Image.open("foo.jpg") pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
但是,在完成所有出色的转换之后,我似乎无法弄清楚如何将其重新加载到PIL对象中。我知道该putdata()方法,但似乎无法使其正常工作。
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数组。这个
putdata
>>> data = list(tuple(pixel) for pixel in pix) >>> pic.putdata(data)
可以工作,但是非常慢。
从PIL 1.1.6开始,在图像和numpy数组之间进行转换的“正确”方法很简单
>>> pix = numpy.array(pic)
尽管结果数组的格式与你的格式不同(在这种情况下为3维数组或行/列/ rgb)。
然后,在对阵列进行更改后,你应该可以执行任一操作pic.putdata(pix)或使用创建新图像Image.fromarray(pix)。
pic.putdata(pix)
Image.fromarray(pix)