小能豆

如何将 PIL 图像转换为 NumPy 数组?

javascript

如何将 PILImage来回转换为 NumPy 数组,以便可以比 PIL 允许的更快地进行像素级转换PixelAccess?我可以通过以下方式将其转换为 NumPy 数组:

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

Image但是,修改数组后,如何将其重新加载到 PIL 中?pic.putdata()效果不佳。


阅读 55

收藏
2024-07-23

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

尽管结果数组的格式与您的不同(在本例中为三维数组或行/列/rgb)。

然后,在对数组进行更改后,您应该能够执行任一操作pic.putdata(pix)或使用创建一个新图像Image.fromarray(pix)

2024-07-23