Python Opencv中用compareHist函数进行直方图比较对比图片

2023-12-17Python编程
349

下面是详细的Python Opencv中用compareHist函数进行直方图比较对比图片的攻略,包括两个示例。

前提条件

在使用compareHist函数进行直方图比较前,需要先了解以下基本概念:

  • 直方图:描述图像的像素值分布情况的统计方法,由若干个像素值范围组成的区间(也称为“箱子”)和落入每个区间内的像素数或像素比例(也称为“项”)构成。

  • 直方图特征向量:描述一张图像的直方图信息所构成的向量。

  • 直方图相似度度量:比较两个直方图特征向量的相似度方法。

compareHist函数的详细说明

compareHist函数用于比较两个直方图特征向量的相似度,函数原型如下:

cv2.compareHist(H1, H2, method)

其中,H1和H2为要进行对比的两个直方图特征向量,method为直方图相似度度量方法。

常用的method参数值有以下几种:

  • cv2.HISTCMP_CORREL:相关性比较法,取值范围为[-1,1],值越大表示越相似(1表示完全相似,0表示不相关,-1表示完全相反)。

  • cv2.HISTCMP_CHISQR:卡方比较法,取值范围为[0, +∞),值越小表示越相似。

  • cv2.HISTCMP_INTERSECT:交集比较法,取值范围为[0,1],值越大表示越相似(1表示完全相同)。

  • cv2.HISTCMP_BHATTACHARYYA:巴氏距离比较法,取值范围为[0,1],值越小表示越相似。

示例1:比较两张图片的直方图相似度

下面是一个示例,演示如何用compareHist函数比较两张图片的直方图相似度。

import cv2 

img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 将图片转换成灰度图
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 计算直方图
hist1 = cv2.calcHist([gray1],[0],None,[256],[0,256])
hist2 = cv2.calcHist([gray2],[0],None,[256],[0,256])

# 进行直方图比较
corr = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
chisqr = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CHISQR)
intersect = cv2.compareHist(hist1, hist2, cv2.HISTCMP_INTERSECT)
bhattacharya = cv2.compareHist(hist1, hist2, cv2.HISTCMP_BHATTACHARYYA)

# 输出相似度结果
print('相关性:', corr)
print('卡方距离:', chisqr)
print('交集:', intersect)
print('巴氏距离:', bhattacharya)

需要先将两张图片转换成灰度图,然后用cv2.calcHist函数计算出直方图特征向量,最后用cv2.compareHist函数比较两个直方图的相似度。

示例2:比较两张图片多通道的直方图相似度

如果要比较的图片是彩色图片,可以考虑使用多通道的直方图特征向量进行比较。下面是一个示例,演示如何比较两张图片多通道的直方图相似度。

import cv2

img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 计算RGB三个通道的直方图
hist1_r = cv2.calcHist([img1],[0],None,[256],[0,256])
hist1_g = cv2.calcHist([img1],[1],None,[256],[0,256])
hist1_b = cv2.calcHist([img1],[2],None,[256],[0,256])
hist1 = cv2.merge([hist1_r, hist1_g, hist1_b])

hist2_r = cv2.calcHist([img2],[0],None,[256],[0,256])
hist2_g = cv2.calcHist([img2],[1],None,[256],[0,256])
hist2_b = cv2.calcHist([img2],[2],None,[256],[0,256])
hist2 = cv2.merge([hist2_r, hist2_g, hist2_b])

# 进行直方图比较
corr = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
chisqr = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CHISQR)
intersect = cv2.compareHist(hist1, hist2, cv2.HISTCMP_INTERSECT)
bhattacharya = cv2.compareHist(hist1, hist2, cv2.HISTCMP_BHATTACHARYYA)

# 输出相似度结果
print('相关性:', corr)
print('卡方距离:', chisqr)
print('交集:', intersect)
print('巴氏距离:', bhattacharya)

这个示例中,需要计算RGB三个通道的直方图特征向量,然后用cv2.merge函数将三个通道合并成一个多通道的直方图特征向量,最后用cv2.compareHist函数比较两个多通道直方图的相似度。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103