openCV python - calcHist合并

时间:2018-05-29 13:57:47

标签: python opencv

我有这个代码用于计算和绘制图像的histrogam。

colors = ('b', 'g', 'r')

for i, col in enumerate(colors):
    hist = cv2.calcHist([imgDEF], [i], None, [256], [1, 256])
    plt.plot(hist, color=col)

plt.show()

此代码为每种rgb颜色生成3个组织图。我需要对每个直方图求和以获得包含所有rgb颜色的单个组织图,因为我需要计算直方图的平均值和标准偏差。

所以任何人都可以帮助我: 1 - 如何仅将三个直方图合并为一个; 2 - 如何计算总直方图的平均值(或std dev)?

非常感谢!

1 个答案:

答案 0 :(得分:1)

要获得表示RGB图像的所有三种颜色的直方图,您可以计算所有像素的强度直方图。为此,您只需将图像转换为灰度,然后计算直方图。例如,像这样:

import cv2
import numpy as np
import matplotlib.pyplot as plt

imgDEF = cv2.imread("YOUR_IMAGE.jpg")
imgGray = cv2.cvtColor(imgDEF, cv2.COLOR_BGR2GRAY)    
ghist = cv2.calcHist([imgGray], [0], None, [256], [0,256])

print ("Mean = {:.1f}, standard deviation = {:.1f}, total = {:.0f}".format(
    np.mean(ghist).item(),
    np.std(ghist).item(),
    np.sum(ghist).item()
))

plt.plot(ghist, color='m')
plt.show()

注意:预计total(直方图的总和)将等于图像中的像素数。

原始答案。

这只会平均你的直方图。但是这个平均值的含义会​​有些含糊不清,因为平均值之和甚至可能不等于像素总数(就像任何实际直方图一样)。

import cv2
import matplotlib.pyplot as plt
import numpy as np

imgDEF = cv2.imread("YOUR_IMAGE.jpg")

colors = ('b', 'g', 'r')

hist = {}
for i, col in enumerate(colors):
    hist[i] = cv2.calcHist([imgDEF], [i], None, [256], [1, 256])
    #plt.plot(hist[i], color=col)

ahist = (hist[0] + hist[1] + hist[2]) / 3

mean = np.mean(ahist).item()
std = np.std(ahist).item()
print ("Mean = {:.1f}, standard deviation = {:.1f}".format(mean, std))

plt.plot(ahist, color='m')
plt.show()