我正在尝试编写一个Python函数,该函数获取RGB图像,查看每个像素的RGB值(0-255),然后简单地求出三个值的平均值。
def avgcolors(img_matrix):
M, N, D = img_matrix.shape
new_img = np.zeros((M, N))
for i in range(M):
for j in range(N):
pixel_mean = int(np.round(np.mean(img_matrix[i][j])))
new_img[i][j] = pixel_mean
return(new_img)
对我来说,这个问题看起来非常简单,用i,j遍历图像矩阵索引像素,找到每个像素的三个值的平均值,并将其写入新的图像矩阵,但是,当我运行以下命令时,奇怪的事情发生了:
pic = Image.open("red.jpg")
img = np.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
grayscale = avgcolors(img)
plt.imshow(grayscale, cmap='gray')
“red.jpg”图像和输出如下所示:
我本以为当脚本达到红色像素时,它会将值255,0,0平均,得到一个值为85的灰色像素。而在其他地方,它只会是黑色。相反,我没有得到它,我得到了奇怪的对角线伪像。我做错了什么?我不知道。
4条答案
按热度按时间k10s72fa1#
您可以简单地使用
img = np.array(pic)
,因为PIL和numpy就是这样理解对方的。不应使用
.getdata()
调用,因为它效率较低。.reshape
* 确实 * 篡改了数据,但不一定 *。你遇到的问题是你把宽度和高度搞混了。
PIL.Image.size
是一个(width, height)
元组。(height, width, channels)
。如果使用
(pic.size[1], pic.size[0], 3)
形状,则原始代码可以正常工作。fdx2calv2#
我找到问题了。问题出在把图像转换成numpy数组的时候。看起来命令
以一种奇怪的方式重新排列数组。我只是将这行代码更改为:
7rtdyuoh3#
我希望我的理解是正确的......如果您试图计算一个三维数组在特定轴上的平均值,您可以使用
np.array.mean(axis=2)
:第一节第一节第一节第一节第一次
qij5mzcb4#
下面是一个使用列表的实现。