如何使用OpenCV Python比较两个图像的直方图?
可以使用cv2.compareHist()函数比较两个图像的直方图。cv2.compareHist()函数接受三个输入参数- hist1,hist2和compare_method。hist1和hist2是两个输入图像的直方图,而compare_method是计算直方图匹配度的指标。它返回一个数值参数,表示两个直方图之间的匹配程度。有四种指标可用于比较直方图-相关性,卡方,交集和Bhattacharyya距离。
步骤
比较两个图像的直方图可以按照以下步骤进行-
- 导入所需的库。在所有以下Python示例中,所需的Python库是OpenCV和Matplotlib。确保您已经安装了它们。
-
使用cv2.imread()函数读取输入图像。传递输入图像的完整路径。
-
使用cv2.calcHist()计算两个输入图像的直方图。
-
使用cv2.normalize()对上述两个输入图像的直方图进行归一化。
-
使用cv2.compareHist()比较这些已归一化的直方图。它返回比较指标值。将合适的直方图比较方法作为参数传递给此方法。
-
打印直方图比较指标值。可选地,绘制两个直方图以进行视觉理解。
让我们看一些示例,以便更好地理解该问题。
输入图像
我们将使用以下图像作为下面示例的输入文件。
示例
在此示例中,我们比较两个输入图像的直方图。我们计算和归一化这两个图像的直方图,然后比较这些已归一化的直方图。
# 导入所需的库
import cv2
import matplotlib.pyplot as plt
# 加载图像
img1 = cv2.imread('horizon.jpg')
img2 = cv2.imread('coins.jpg')
# 计算直方图,并将其归一化
hist_img1 = cv2.calcHist([img1], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
cv2.normalize(hist_img1, hist_img1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
hist_img2 = cv2.calcHist([img2], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
cv2.normalize(hist_img2, hist_img2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# 找到评估值
metric_val = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
print("Metric Value:", metric_val)
# 绘制两个图像的直方图
plt.subplot(121), plt.hist(img1.ravel(),256,[0,256]), plt.title('horizon.jpg')
plt.subplot(122), plt.hist(img2.ravel(),256,[0,256]), plt.title('coins.jpg')
plt.show()
输出
执行后,将产生以下 输出 −
Metric Value: -0.13959840937070855
并且我们将获得以下窗口显示的输出 −
示例
在此示例中,我们使用四种不同的比较方法比较两个输入图像的直方图: HISTCMP_CORREL,HISTCMP_CHISQR,HISTCMP_INTERSECT, 和 HISTCMP_BHATTACHARYYA。 我们计算并归一化这两个图像的直方图,然后比较这些归一化的直方图。
# 导入必要的库
import cv2
import matplotlib.pyplot as plt
# 加载图片
img1 = cv2.imread('horizon.jpg')
img2 = cv2.imread('coins.jpg')
# 计算直方图并归一化
hist_img1 = cv2.calcHist([img1], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
cv2.normalize(hist_img1, hist_img1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
hist_img2 = cv2.calcHist([img2], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
cv2.normalize(hist_img2, hist_img2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# 计算度量值
metric_val1 = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
metric_val2 = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CHISQR)
metric_val3 = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_INTERSECT)
metric_val4 = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_BHATTACHARYYA)
print("Metric Value using Correlation Hist Comp Method", metric_val1)
print("Metric Value using Chi Square Hist Comp Method", metric_val2)
print("Metric Value using Intersection Hist Comp Method", metric_val3)
print("Metric Value using Bhattacharyya Hist Comp Method", metric_val4)
输出
执行后,将产生以下输出 输出结果 −
Metric Value using Correlation Hist Comp Method: -0.13959840937070855
Metric Value using Chi Square Hist Comp Method: 763.9389629197002
Metric Value using Intersection Hist Comp Method: 6.9374825183767825
Metric Value using Bhattacharyya Hist Comp Method: 0.9767985879980464