首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将PIL图像转换为numpy数组?

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

Stack Overflow用户
提问于 2008-12-21 18:21:32
回答 8查看 643K关注 0票数 376

好了,我正在尝试将一个PIL图像对象来回转换为一个数值数组,这样我就可以进行一些比PIL的PixelAccess对象所允许的更快的逐个像素转换。我已经想出了如何将像素信息放在一个有用的3D numpy数组中,方法是:

代码语言:javascript
运行
复制
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

但是在我完成了所有令人惊叹的转换之后,我似乎不知道如何将它重新加载到PIL对象中。我知道putdata()方法,但似乎不能让它正常工作。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-12-21 20:46:21

你并没有说putdata()到底有多不正常。我假设你是在做

代码语言:javascript
运行
复制
>>> 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数组。这

代码语言:javascript
运行
复制
>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)

将工作,但它是非常慢的。

从PIL1.1.6开始,"proper" way to convert between images and numpy arrays是简单的

代码语言:javascript
运行
复制
>>> pix = numpy.array(pic)

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

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

票数 386
EN

Stack Overflow用户

发布于 2009-07-08 02:33:17

I作为数组打开:

代码语言:javascript
运行
复制
>>> I = numpy.asarray(PIL.Image.open('test.jpg'))

I执行一些操作,然后将其转换回图像:

代码语言:javascript
运行
复制
>>> im = PIL.Image.fromarray(numpy.uint8(I))

来源:Filter numpy images with FFT, Python

如果您出于某种原因想显式地执行此操作,可以使用correlation.zip中的this page上的pil2array()和array2pil()函数。

票数 275
EN

Stack Overflow用户

发布于 2017-06-18 00:41:07

我在Python3.5中使用Pillow 4.1.1 (PIL的后继者)。Pillow和numpy之间的转换很简单。

代码语言:javascript
运行
复制
from PIL import Image
import numpy as np
im = Image.open('1.jpg')
im2arr = np.array(im) # im2arr.shape: height x width x channel
arr2im = Image.fromarray(im2arr)

需要注意的一件事是,Pillow样式的im是列主要的,而numpy样式的im2arr是行主要的。但是,函数Image.fromarray已经考虑到了这一点。即上面示例中的arr2im.size == im.sizearr2im.mode == im.mode

在处理转换后的numpy数组时,我们应该注意HxWxC的数据格式,例如将im2arr = np.rollaxis(im2arr, 2, 0)im2arr = np.transpose(im2arr, (2, 0, 1))转换为CxHxW格式。

票数 101
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/384759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档