np.sum计算结果异常偏高,图像红色像素均值计算问题求助
计算红色像素平均值结果异常,输出超出255范围
我尝试计算图像中红色像素的平均值,编写的代码如下:
path = "C:\\Users\\Ariana\\Pictures\\img.jpg" img = PIL.Image.open(path) imgarray = np.array(img) reds = imgarray[:, 0] avered = np.sum(reds)/len(reds) print(avered)
像素值的最大值为255,因此结果应不超过255,但当前输出为275,不符合预期。我尝试在使用np.sum时指定axis参数,也尝试使用普通sum函数,但两种方式都返回数组作为结果。请问是数组切片错误还是np.sum使用错误?
问题根源:红色通道切片错误
你的问题出在红色通道的提取逻辑上:
当PIL图像转为numpy数组后,数组维度为(图像高度, 图像宽度, 通道数)(RGB图的通道顺序是R→G→B)。你写的imgarray[:, 0]实际是提取了每一行的第0列像素的所有通道值,而非所有像素的红色通道。这类错误切片得到的数组包含了R、G、B三个通道的数值,求和后自然会超出单通道0-255的范围,且sum指定axis后会返回数组而非单值。
修正代码
正确提取所有像素红色通道的切片是imgarray[:, :, 0](所有行、所有列、第0个通道),同时用reds.size获取总像素数更准确,也可以直接用np.mean一步计算平均值:
import numpy as np from PIL import Image path = "C:\\Users\\Ariana\\Pictures\\img.jpg" img = Image.open(path) imgarray = np.array(img) reds = imgarray[:, :, 0] # 正确提取红色通道 avered = np.sum(reds) / reds.size # 手动计算平均值 # 或者更简洁:avered = np.mean(reds) print(avered)
额外说明
len(reds)返回的是图像的高度(行数),而reds.size是红色通道的总像素数(高度×宽度),后者才是计算平均值的正确分母。- 使用
np.mean(reds)可以避免手动求和除以总数的出错概率,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Ariana DeLuca
相关产品推荐
相关产品推荐

