首页 > 解决方案 > 如何从直方图中计算每个通道的平均值?

问题描述

我想从直方图中找到每个通道(R,G,B)的平均值。我正在使用的直方图来自图片的裁剪区域。我正在使用 Python 和 openCV,但我愿意使用不同的库。

所以首先我加载图像,然后裁剪感兴趣的区域。然后我对每个通道(BGR)使用 calcHist。这是蓝色通道的直方图。因此,由此得出的平均值应该在 140 左右。但是当将 histrB.mean() 用于蓝色通道时,我得到 17。我发现 mean() 正在执行以下操作: sum(histB)/len(np.count_nonzero (历史))。每个 hist 都是一个长度为 256 的向量,并且有很多零,就像图中所示。到目前为止,这是我的代码:

image='image.jpg'
img= cv.imread(image) 
areaofinterest = img[145:193, 430:455]

histB = cv.calcHist([areaofinterest],[0],None,[256],[0,256])
histG = cv.calcHist([areaofinterest],[1],None,[256],[0,256])
histR = cv.calcHist([areaofinterest],[2],None,[256],[0,256])

我还想从每个通道中找到最大值并使用 max(histG) ,它实际上返回了向量中的最大值。

先感谢您

标签: pythonopencvimage-processing

解决方案


直方图显示图像中值的分布。

histrB.mean()计算向量 histrB 的平均值,它是所有向量元素的总和除以元素的数量。这将是直方图中每个 bin 的平均值数。

如果您想计算蓝色通道的平均值,您可以从图像本身计算它,或者如果您想从直方图计算它,您必须将每个值箱乘以该箱中的元素数并将这些值相加然后将该总和除以像素数

最大值和最小值相同。该直方图的最大值将为您提供所有 bin 中最高的像素数。

相反,您正在寻找具有 > 0 个元素的最高 bin。或具有 > 0 个元素的最低 bin 用于最小蓝色值。

确保您了解直方图是什么!


推荐阅读