当前位置: 首页 > news >正文

OpenCV直方图比较:原理与四种方法详解

什么是直方图比较?

直方图比较是计算机视觉中一种重要的图像相似度度量方法。它通过统计图像中像素值的分布特征,将图像内容转化为数值表示,进而比较不同图像之间的相似程度。这种方法对旋转、缩放和轻微视角变化具有一定的不变性,因此在图像检索、目标识别和图像分类等领域有广泛应用。

OpenCV中的直方图计算

在OpenCV中,我们使用calcHist()函数来计算图像的直方图。以下是该函数的详细参数说明:

void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize,const float** ranges,bool uniform = true, bool accumulate = false);
  • images:输入的图像的指针
  • nimages:输入图像个数
  • channels:需要统计直方图的通道索引
  • mask:掩模,必须是8位(CV_8U)数组且与images大小相同
  • hist:直方图计算的输出值
  • dims:输出直方图的维度
  • histSize:每个维度的直方图区间数(柱子数量)
  • ranges:统计像素值的区间范围
  • uniform:是否对直方图进行归一化处理
  • accumulate:是否累积计算多幅图像的像素值

实战:HSV颜色空间直方图比较

下面是一个完整的直方图比较示例代码:

void CompareHist()
{// 显示原始图像imshow("input1", image);imshow("input2", temp);// 转换到HSV颜色空间Mat hsv1, hsv2;cvtColor(image, hsv1, COLOR_BGR2HSV);cvtColor(temp, hsv2, COLOR_BGR2HSV);// 设置直方图参数int h_bins = 60; int s_bins = 64;int histSize[] = { h_bins, s_bins };float h_ranges[] = { 0, 180 };float s_ranges[] = { 0, 256 };const float* ranges[] = { h_ranges, s_ranges };int channels[] = { 0, 1 };// 计算直方图Mat hist1, hist2;calcHist(&hsv1, 1, channels, Mat(), hist1, 2, histSize, ranges, true, false);calcHist(&hsv2, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false);// 归一化处理normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());// 4种比较方法for (int i = 0; i < 4; i++){int compare_method = i;double src1_src2 = compareHist(hist1, hist2, compare_method);qDebug() << " Method" << i << ": src1_src2:" << src1_src2;printf(" Method [%d]  : src1_src2 : %f \n", i, src1_src2);}waitKey(0);
}

四种直方图比较方法详解

OpenCV提供了四种主要的直方图比较方法,每种方法都有其特点和适用场景:

1. 相关性比较 (CV_COMP_CORREL)

double result = compareHist(hist1, hist2, CV_COMP_CORREL);
  • 原理:基于皮尔逊相关系数,衡量两个直方图的线性相关性
  • 范围:[0, 1]
  • 解释:值越接近1,表示直方图相似度越高
  • 公式d(H1,H2)=∑I(H1(I)−H1ˉ)(H2(I)−H2ˉ)∑I(H1(I)−H1ˉ)2∑I(H2(I)−H2ˉ)2d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I (H_1(I) - \bar{H_1})^2 \sum_I (H_2(I) - \bar{H_2})^2}}d(H1,H2)=I(H1(I)H1ˉ)2I(H2(I)H2ˉ)2I(H1(I)H1ˉ)(H2(I)H2ˉ)

2. 卡方检验 (CV_COMP_CHISQR)

double result = compareHist(hist1, hist2, CV_COMP_CHISQR);
  • 原理:基于卡方统计量,检验两个分布的差异性
  • 范围:[0, ∞)
  • 解释:值越接近0,表示直方图相似度越高
  • 公式d(H1,H2)=∑I(H1(I)−H2(I))2H1(I)d(H_1,H_2) = \sum_I \frac{(H_1(I) - H_2(I))^2}{H_1(I)}d(H1,H2)=IH1(I)(H1(I)H2(I))2

3. 直方图相交 (CV_COMP_INTERSECT)

double result = compareHist(hist1, hist2, CV_COMP_INTERSECT);
  • 原理:计算两个直方图在每个区间的重合程度
  • 范围:[0, ∞)
  • 解释:值越大,表示直方图相似度越高
  • 公式d(H1,H2)=∑Imin⁡(H1(I),H2(I))d(H_1,H_2) = \sum_I \min(H_1(I), H_2(I))d(H1,H2)=Imin(H1(I),H2(I))

4. 巴氏距离 (CV_COMP_BHATTACHARYYA)

double result = compareHist(hist1, hist2, CV_COMP_BHATTACHARYYA);
  • 原理:测量两个概率分布之间的重叠程度
  • 范围:[0, 1]
  • 解释:完全匹配为0,完全不匹配为1(与其它方法相反)
  • 公式d(H1,H2)=1−1H1ˉH2ˉN2∑IH1(I)⋅H2(I)d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}d(H1,H2)=1H1ˉH2ˉN21IH1(I)H2(I)

方法选择建议

  1. 巴氏距离:在直方图比较中通常效果最佳,对分布形状变化敏感
  2. 相关性比较:适用于线性相关的分布比较
  3. 卡方检验:适合检验理论分布与实际分布的拟合优度
  4. 直方图相交:计算简单,适用于快速初步比较

注意事项

  1. 颜色空间选择:HSV颜色空间比RGB更适合颜色直方图比较,因为它将亮度与色度信息分离
  2. 归一化处理:比较前必须对直方图进行归一化,消除图像大小的影响
  3. 区间数选择:histSize参数影响计算精度和效率,需要根据具体应用调整
  4. 通道选择:可以根据需要选择不同的颜色通道组合

总结

直方图比较是图像处理中的基础技术,OpenCV提供了丰富的函数支持。通过理解不同比较方法的原理和特点,我们可以根据具体应用场景选择最合适的方法。在实际项目中,通常需要结合多种特征和比较方法,才能获得最佳的图像匹配效果。

希望本文能帮助您更好地理解和应用OpenCV中的直方图比较技术!

http://www.dtcms.com/a/395281.html

相关文章:

  • OpenCV - 图像金字塔
  • 寄存柜频繁维护还卡顿?杰和IB2-281主板:智能化升级高效省心
  • 海外短剧系统开发:多语言适配与跨地区部署的架构实践
  • JVM内存模型详解:看内存公寓如何分配“房间“
  • 【论文阅读】4D-VLA:时空视觉-语言-动作预训练与跨场景校准
  • 【论文阅读】MDM : HUMAN MOTION DIFFUSION MODEL
  • 【论文阅读】RynnVLA-001:利用人类示范改进机器人操作
  • Leecode hot100 - 105.从前序与中序遍历序列构造二叉树
  • 联邦学习论文分享:Federated Learning with GAN-based Data Synthesis for Non-IID Clients
  • 绕过百度网盘无限制下载
  • 【自记】PyCharm 更换阿里云国内源教程
  • 【Axure原型分享】区间K线图
  • javascript之Es6八股文
  • npm和pnpm命令大全
  • kali下安装beef-xss报错-启动失败-简单详细
  • 政策法规下的LLM安全:合规之路
  • 《第21课——C typedef:从Java的“实名制”到C的“马甲生成器”——类型伪装术与代码整容的艺术》
  • 【每天一个知识点】什么是知识库?
  • 豆包·Seedream 4.0深度测评:4K多模态时代的图像创作革命(图文增强版)
  • [新启航]发动机喷管推进剂输送孔光学 3D 轮廓测量 - 激光频率梳 3D 轮廓技术
  • 深入理解 TCP 协议:三次握手与四次挥手的底层原理
  • PyTorch 神经网络工具箱
  • 机器学习-多因子线性回归
  • 国产化Excel开发组件Spire.XLS教程:Python 写入 Excel 文件,数据写入自动化实用指南
  • 08 - spring security基于jdbc的账号密码
  • 解决SSL证书导致源站IP被泄露的问题
  • Worst Western Hotel: 1靶场渗透
  • 电子电气架构 --- 软件开发与产品系统集成流程(上)
  • 运维安全08,日志检测和 tcpdump (抓包) 的介绍以及使用
  • DSC 归档配置相关