为何使用Reduce+Lambda与mean计算图像像素均值结果不同?
问题原因分析
你遇到的差异本质上是因为这两行代码计算的是完全不同的统计量,我们来逐一拆解:
1. reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3]) 的行为
假设你的eachPix是一行像素的列表(每个像素是RGB三通道的数组/元组):
eachPix[:3]取的是该行的前3个像素;reduce(lambda x,y: x+y, ...)会把这3个像素的对应通道逐个相加,最终得到一个三元素数组,比如[R1+R2+R3, G1+G2+G3, B1+B2+B3];- 除以3之后,得到的是这3个像素每个通道的独立平均值(即RGB三个分开的均值),你看到的80.3应该是其中某一个通道的均值(比如红色通道)。
2. np.mean(eachPix[:3]) 的行为
numpy.mean() 默认会把输入的多维数组拉平成一维再计算全局平均值:
eachPix[:3]同样是前3个像素(对应形状为(3,3)的数组);np.mean()会把这9个数值(3像素 × 3通道)全部加起来,再除以9,得到的是这3个像素所有通道值的全局算术平均。如果你的RGB通道值差异较大(比如R通道偏低、G/B通道偏高),这个全局均值就会和单个通道的均值相差很大,比如你得到的165。
如何修正到你想要的结果
如果你想计算每行像素的平均RGB值(每个通道单独求均值),可以用:
# 对每行的所有像素,按通道维度求均值 row_avg_rgb = np.mean(eachPix, axis=0)
如果你想计算每行像素的灰度均值(符合人眼感知的灰度转换),可以用加权平均:
# 按照RGB转灰度的标准权重计算 row_gray_avg = np.mean(0.2989*eachPix[:,0] + 0.5870*eachPix[:,1] + 0.1140*eachPix[:,2])
如果你只是想和reduce的结果对齐(计算前3个像素的通道均值),可以指定mean的轴参数:
# 和reduce方法的结果完全一致,计算前3个像素的每个通道均值 np.mean(eachPix[:3], axis=0)
内容的提问来源于stack exchange,提问作者user3762120
相关产品推荐
相关产品推荐

