Python KeyError:((1,11280),';| u1';)在使用PIL';s Image.fromarray-PIL

Python KeyError:((1,11280),';| u1';)在使用PIL';s Image.fromarray-PIL,python,image,numpy,python-imaging-library,pixel,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中修改图像的像素,但是当我运行它时,会出现如下错误: KeyEr

我有以下代码:

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
不仅如此,它还输出第二个错误,如下所示:

KeyError: ((1, 1, 1280), '|u1')
TypeError: Cannot handle this data type
有没有办法克服这个问题

p.S.我搜索过,与我最相关的问题是:


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

用于通过任何图像库读取特定像素,如
PIL
OpenCV
图像的第一个通道是高度第二个通道是宽度,最后一个通道是通道数,这里是
3
。将图像转换为灰度时,第三个通道将为
1

但是,如果要使用
image.fromarray
将numpy数组转换为PIL图像,则会发生此错误,但会显示以下错误:

KeyError: ((1, 1, 3062), '|u1')
在这里,您可以看到另一种解决方案:

数据的形状。 枕头的
fromarray
功能只能执行MxNx3阵列(RGB图像)或MxN阵列(灰度)。要使灰度图像正常工作,必须将MxNx1阵列转换为MxN阵列。您可以使用
np.reformate()
函数来实现这一点。这将使数据平坦化,然后将其放入不同的数组形状中

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

(在
img=Image.fromarray(img)
之前添加此项)

我不确定您想做什么,但如果您想知道平均值:

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')

我看不懂你的代码,一行中的步骤太多了。尝试更短的行-更容易调试。你想用什么方式修改像素?@MarkSetchell-Ugh我对难看的代码上瘾:PIn你想用什么方式修改像素?你是在每一个加1吗?或者是平均值?如果我知道你想做什么,我相信有一个更简单的解决办法@MarkSetchell我是先平均像素高还是先平均像素宽?因此,如果1920x1020
M
将是
1020
N
将是
1920
?在PIL中,高度是第一个,宽度是第二个。我写的答案是基于和高度,宽度=np.array(im)。当你写1920*1020时,形状和@U10绝对向前,1920是宽度,1020是高度。但当你称之为PIL时,它会给我们什么样的维度呢?所以函数返回(10201920)所以1020是高度,1920是宽度。我会尽快给你反馈,这不是我想要的