如何使用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