如何使用OpenCV Python比较两个图像的直方图?

两个图像的直方图可以使用cv2.compareHist()函数进行比较。cv2.compareHist() 函数接受三个输入参数 - hist1、hist2 和 compare_methodhist1 和 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_INTERSECTHISTCMP_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
posted @ 2022-12-23 21:46  很酷的站长  阅读(282)  评论(0编辑  收藏  举报
70博客 AI工具 源码下载