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

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

可以使用 cv2.compareHist() 函数来比较两个图像的直方图。cv2.compareHist()函数接受三个输入参数- hist1、hist2compare_method 。其中 hist1hist2 是两个输入图像的直方图, compare_method 是用于计算直方图匹配的度量标准。它返回一个数值参数,表示两个直方图之间的匹配程度。有四个度量参数可用于比较直方图-相关性、卡方、交叉和巴氏距离。

步骤

要比较两个图像的直方图,可以按照以下步骤进行:

  • 导入所需的库。在下面的所有Python示例中,需要使用的Python库是 OpenCVMatplotlib 。请确保您已经安装了它们。

  • 使用 cv2.imread() 函数读取输入图像。传递输入图像的完整路径。

  • 使用 cv2.calcHist() 计算两个输入图像的直方图。

  • 使用 cv2.normalize() 对上述两个输入图像的直方图进行归一化。

  • 使用 cv2.compareHist() 比较这些归一化的直方图。它返回比较度量值。将适当的直方图比较方法作为参数传递给该方法。

  • 打印直方图比较度量值。可选择绘制两个直方图以便视觉理解。

让我们看一些示例,以便更清楚地理解问题。

输入图像

我们将使用以下图像作为下面示例中的输入文件。

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

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

示例

在这个示例中,我们比较两个输入图像的直方图。我们计算并归一化两个图像的直方图,然后比较这些归一化的直方图。

# 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

下面的窗口显示输出结果−

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

示例

在这个示例中,我们使用四种不同的比较方法比较两个输入图像的直方图: 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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程