Python OpenCV compareHist函数实现图像直方图对比

阿橙
阿橙
发布时间:2026-10-13| 4人浏览过
原创

本文介绍如何利用Python和OpenCV中的compareHist函数进行图像直方图对比。详细解析相关性、卡方及巴氏距离三种比较方法的原理与数值含义,并通过具体代码示例展示如何计算并解读图像相似度结果,适用于特征提取与图像匹配场景。

图像直方图基础

图像直方图

图像直方图是统计图像像素分布的图表,横坐标表示像素的灰度或颜色类别,纵坐标则表示每种颜色值的像素总数或所占百分比。由于图像由像素构成,直方图能反映图像的重要特征,广泛应用于特征提取和图像匹配等工程领域。

直方图比较的应用

直方图比较

1. 图像相似度比较

若两张图像的直方图一致或高度相似,可初步判定这两幅图像内容相近。这是直方图比较技术的一个典型应用场景。

2. 分析图像之间关系

通过对比不同图像的直方图分布情况,可以深入分析图像间的内在联系与差异。

compareHist函数详解

直方图比较函数

cv2.compareHist(H1, H2, method)

参数说明如下:

  • H1、H2:分别代表待比较的两张图像的直方图数据。
  • method:指定具体的比较算法类型。

常用比较方式包括:

  • 相关性比较(method=cv.HISTCMP_CORREL):返回值越大表示相关度越高,取值范围0到1,最大值为1。
  • 卡方比较(method=cv.HISTCMP_CHISQR):返回值越小表示相关度越高,最小值为0,理论上无上界。
  • 巴氏距离比较(method=cv.HISTCMP_BHATTACHARYYA):返回值越小表示相关度越高,取值范围0到1,最小值为0。

代码实现与结果分析

代码实现


import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def create_rgb_hist(image):
 """"创建 RGB 三通道直方图(直方图矩阵)"""
 h, w, c = image.shape
 # 创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵 
 # 16*16*16的意思为三通道每通道有16个bins
 rgbhist = np.zeros([16 * 16 * 16, 1], np.float32)
 bsize = 256 / 16
 for row in range(h):
  for col in range(w):
   b = image[row, col, 0]
   g = image[row, col, 1]
   r = image[row, col, 2]
   # 人为构建直方图矩阵的索引,该索引是通过每一个像素点的三通道值进行构建
   index = int(b / bsize) * 16 * 16 + int(g / bsize) * 16 + int(r / bsize)
   # 该处形成的矩阵即为直方图矩阵
   rgbhist[int(index), 0] += 1
 plt.ylim([0, 10000])
 plt.grid(color='r', linestyle='--', linewidth=0.5, alpha=0.3)
 return rgbhist
def hist_compare(image1, image2):
 """直方图比较函数"""
 # 创建第一幅图的rgb三通道直方图(直方图矩阵)
 hist1 = create_rgb_hist(image1)
 # 创建第二幅图的rgb三通道直方图(直方图矩阵)
 hist2 = create_rgb_hist(image2)
 # 进行三种方式的直方图比较
 match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
 match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
 match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
 print("巴氏距离:%s, 相关性:%s, 卡方:%s" %(match1, match2, match3))
src1 = cv.imread("diff1.PNG")
cv.imshow("diff1", src1)
src2 = cv.imread("diff2.PNG")
cv.imshow("diff2", src2)
plt.subplot(1,2,1)
plt.title("diff1")
plt.plot(create_rgb_hist(src1))
plt.subplot(1,2,2)
plt.title("diff2")
plt.plot(create_rgb_hist(src2))
hist_compare(src1, src2)
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()

巴氏距离:0.3116175231543461, 相关性:0.8805851455583134, 卡方:154379.82963705878

根据上述计算结果,巴氏距离较低且相关性较高,表明这两幅图像的相似度较大。

例如下面两幅图

巴氏距离:0.8939676325760126, 相关性:0.03202528698270991, 卡方:503948.24201884575

从计算结果可见,巴氏距离较高且相关性系数极低,表明这两幅图像的相似度非常低。

总结

至此,关于在Python OpenCV中使用compareHist函数进行直方图对比以比较图片的文章介绍完毕。如需了解更多Python OpenCV compareHist函数及直方图相关内容,欢迎查阅本站往期文章或继续浏览后续内容,感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。