akd*_*dom 212 python numpy image python-imaging-library numpy-ndarray
好吧,我正在四处寻找将PIL图像对象来回转换为numpy数组,这样我就可以比PIL的PixelAccess对象允许更快的像素转换.我已经想出如何通过以下方式将像素信息放在一个有用的3D numpy数组中:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Run Code Online (Sandbox Code Playgroud)
但在完成所有令人敬畏的变换后,我似乎无法弄清楚如何将其加载回PIL对象.我知道这个putdata()方法,但似乎无法让它表现出来.
dF.*_*dF. 249
你不是说究竟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
Run Code Online (Sandbox Code Playgroud)
这是因为putdata需要一系列元组,并且你给它一个numpy数组.这个
>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)
Run Code Online (Sandbox Code Playgroud)
会工作,但它很慢.
从PIL 1.1.6开始,在图像和numpy数组之间进行转换的"正确"方法很简单
>>> pix = numpy.array(pic)
Run Code Online (Sandbox Code Playgroud)
虽然生成的数组格式与您的格式不同(在这种情况下为3-d数组或行/列/ rgb).
然后,在对数组进行更改后,您应该可以使用pic.putdata(pix)或创建新图像Image.fromarray(pix).
end*_*ith 168
I以数组形式打开:
>>> I = numpy.asarray(PIL.Image.open('test.jpg'))
Run Code Online (Sandbox Code Playgroud)
做一些东西I,然后,将其转换回图像:
>>> im = PIL.Image.fromarray(numpy.uint8(I))
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因想要显式地执行它,则在correlation.zip的此页面上使用getdata()函数有pil2array()和array2pil()函数.
Dan*_*iel 54
我在Python 3.5中使用Pillow 4.1.1(PIL的后继者).Pillow和numpy之间的转换非常简单.
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)
Run Code Online (Sandbox Code Playgroud)
需要注意的一件事是,Pillow风格im是列专业,而numpy风格im2arr是行专业.但是,该功能Image.fromarray已经考虑到了这一点.即,arr2im.size == im.size和arr2im.mode == im.mode在上面的例子.
处理转换后的numpy数组时,我们应该处理HxWxC数据格式,例如转换im2arr = np.rollaxis(im2arr, 2, 0)或im2arr = np.transpose(im2arr, (2, 0, 1))转换为CxHxW格式.
Kam*_*mov 19
转换Numpy to PIL图像和PIL to Numpy
import numpy as np
from PIL import Image
def pilToNumpy(img):
return np.array(img)
def NumpyToPil(img):
return Image.fromarray(img)
Run Code Online (Sandbox Code Playgroud)
Bil*_*adj 15
您需要以这种方式将图像转换为numpy数组:
import numpy
import PIL
img = PIL.Image.open("foo.jpg").convert("L")
imgarr = numpy.array(img)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
340179 次 |
| 最近记录: |