KeyError:(((1,1,1280),'| u1')在使用PIL的Image.fromarray-PIL时

时间:2019-08-23 06:44:42

标签: python image numpy python-imaging-library pixel

我有此代码:

from PIL import Image
import numpy as np
img = Image.open('img.jpg')
Image.fromarray(np.array([[np.mean(i, axis=1).astype(int).tolist()]*len(i) for i in np.array(img).tolist()]).astype('uint8')).show()

我正在尝试修改PIL中图像的像素,但是当我运行它时,会出现如下错误:

KeyError: ((1, 1, 1280), '|u1')

不仅如此,它还会输出第二个错误,如下所示:

TypeError: Cannot handle this data type

有办法克服吗?

P.S。我搜索了,最相关的问题是:

Convert numpy.array object to PIL image object

但是我不明白,也不知道如何实现。

2 个答案:

答案 0 :(得分:1)

要通过PILOpenCV之类的任何图像库读取特定像素,图像的第一通道为高度,第二通道为 Width ,最后一个是频道数,这里是3。将图像转换为灰度时,第三个通道将为1

但是当您想使用Image.fromarray将numpy数组转换为PIL图像时发生此错误,但是它显示以下错误:

KeyError: ((1, 1, 3062), '|u1')

在这里您可以看到另一种解决方案: Convert numpy.array object to PIL image object

数据的形状。 枕头的fromarray函数只能执行MxNx3阵列(RGB图像)或MxN阵列(灰度)。要使灰度图像起作用,您必须将MxNx1阵列转换为MxN阵列。您可以使用np.reshape()函数来完成此操作。这样会将数据弄平,然后将其放入其他数组形状。

img = img.reshape(M, N) #let M and N be the dimensions of your image

(将其添加到img = Image.fromarray(img)之前)

答案 1 :(得分:0)

我不确定您要做什么,但是如果您想要这个意思:

from PIL import Image
import numpy as np
img = Image.open('img.jpg')

# Make Numpy array
imgN = np.array(img)

mean = np.mean(imgN,axis=2)

# Revert back to PIL Image from Numpy array
result = Image.fromarray(mean)

或者,如果您想要灰度来代替均值

from PIL import Image
import numpy as np
img = Image.open('img.jpg').convert('L')