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

更新于: 2022-12-02

5K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告