我有此代码:
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
但是我不明白,也不知道如何实现。
答案 0 :(得分:1)
要通过PIL
或OpenCV
之类的任何图像库读取特定像素,图像的第一通道为高度,第二通道为 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')