OpenCV Python 如何比较两个图像的直方图
可以使用 cv2.compareHist() 函数来比较两个图像的直方图。cv2.compareHist()函数接受三个输入参数- hist1、hist2 和 compare_method 。其中 hist1 和 hist2 是两个输入图像的直方图, compare_method 是用于计算直方图匹配的度量标准。它返回一个数值参数,表示两个直方图之间的匹配程度。有四个度量参数可用于比较直方图-相关性、卡方、交叉和巴氏距离。
步骤
要比较两个图像的直方图,可以按照以下步骤进行:
- 导入所需的库。在下面的所有Python示例中,需要使用的Python库是 OpenCV 和 Matplotlib 。请确保您已经安装了它们。
-
使用 cv2.imread() 函数读取输入图像。传递输入图像的完整路径。
-
使用 cv2.calcHist() 计算两个输入图像的直方图。
-
使用 cv2.normalize() 对上述两个输入图像的直方图进行归一化。
-
使用 cv2.compareHist() 比较这些归一化的直方图。它返回比较度量值。将适当的直方图比较方法作为参数传递给该方法。
-
打印直方图比较度量值。可选择绘制两个直方图以便视觉理解。
让我们看一些示例,以便更清楚地理解问题。
输入图像
我们将使用以下图像作为下面示例中的输入文件。
示例
在这个示例中,我们比较两个输入图像的直方图。我们计算并归一化两个图像的直方图,然后比较这些归一化的直方图。
# import required libraries
import cv2
import matplotlib.pyplot as plt
# Load the images
img1 = cv2.imread('horizon.jpg')
img2 = cv2.imread('coins.jpg')
# Calculate the histograms, and normalize them
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)
# Find the metric value
metric_val = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
print("Metric Value:", metric_val)
# plot the histograms of two images
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 required libraries
import cv2
import matplotlib.pyplot as plt
# Load the images
img1 = cv2.imread('horizon.jpg')
img2 = cv2.imread('coins.jpg')
# Calculate the histograms, and normalize them
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)
# Find the metric value
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