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

新手上路,请多包涵

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

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

但是,在我修改了数组之后,如何将它加载回 PIL Imagepic.putdata() 不能正常工作。

原文由 akdom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

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

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

原文由 dF. 发布,翻译遵循 CC BY-SA 4.0 许可协议

打开 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() 函数。

原文由 endolith 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题