一尘不染

Python-如何将PIL图像转换为numpy数组?

python

好吧,我想将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()方法,但似乎无法使其正常工作。


阅读 1131

收藏
2020-02-21

共1个答案

一尘不染

你并不是在说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维数组或行/列/ rgb)。

然后,在对阵列进行更改后,你应该可以执行任一操作pic.putdata(pix)或使用创建新图像Image.fromarray(pix)

2020-02-21