Opencv中的直方图(3)直方图比较函数compareHist()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

比较两个直方图。

函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。

该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1,H2)

虽然该函数在处理一维、二维或三维的密集直方图时效果很好,但它可能不适合高维的稀疏直方图。在这样的直方图中,由于别名(aliasing)和采样问题,非零直方图bin的坐标可能会略微偏移。为了比较这样的直方图或更一般的加权点的稀疏配置,可以考虑使用 EMD 函数。

compareHist 是 OpenCV 中用于比较两个直方图相似性的函数。这个函数可以用来衡量两个直方图之间的差异或相似程度,常用于图像处理和计算机视觉任务中,比如图像检索、图像匹配或特征比较等。

函数原型1

cpp 复制代码
ouble cv::compareHist
(
	InputArray 	H1,
	InputArray 	H2,
	int 	method 
)		

参数1

  • 参数H1 第一个被比较的直方图。
  • 参数H2 第二个被比较的直方图,与 H1 具有相同的尺寸。
  • 参数method 比较方法,参见 HistCompMethods

函数原型2

这是一个重载的成员函数,为了方便而提供。它与上述函数的不同之处仅在于它接受的参数。

cpp 复制代码
double cv::compareHist
(
	const SparseMat & 	H1,
	const SparseMat & 	H2,
	int 	method 
)		

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    // 加载两幅图像
    cv::Mat image1 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg", cv::IMREAD_GRAYSCALE );
    cv::Mat image2 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu2.png", cv::IMREAD_GRAYSCALE );

    if ( image1.empty() || image2.empty() )
    {
        std::cerr << "Error: Images not found or unable to read." << std::endl;
        return -1;
    }

    // 计算两个图像的直方图
    int histSize           = 256;
    float range[]          = { 0, 256 };
    const float* histRange = { range };
    bool uniform           = true;
    bool accumulate        = false;

    cv::Mat hist1, hist2;
    calcHist( &image1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate );
    calcHist( &image2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate );

    // 归一化直方图
    cv::normalize( hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat() );
    cv::normalize( hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat() );

    // 比较两个直方图
    double result_correlation   = compareHist( hist1, hist2, cv::HISTCMP_CORREL );
    double result_chisqr        = compareHist( hist1, hist2, cv::HISTCMP_CHISQR );
    double result_intersect     = compareHist( hist1, hist2, cv::HISTCMP_INTERSECT );
    double result_bhattacharyya = compareHist( hist1, hist2, cv::HISTCMP_BHATTACHARYYA );

    std::cout << "Correlation: " << result_correlation << std::endl;
    std::cout << "Chi-Squared: " << result_chisqr << std::endl;
    std::cout << "Intersection: " << result_intersect << std::endl;
    std::cout << "Bhattacharyya Distance: " << result_bhattacharyya << std::endl;

    return 0;
}

运行结果

输出结果解释

  1. Correlation (相关性):

    • 含义:相关性比较方法衡量两个直方图之间的线性关系。值范围通常在 -1 到 1 之间。
    • 结果:result_correlation 表示两个直方图的相关性得分。
    • 解释:如果结果接近 1,则表示两个直方图高度相关;如果接近 0,则表示没有相关性;如果接近 -1,则表示负相关。
  2. Chi-Squared (卡方):

    • 含义:卡方比较方法衡量两个直方图之间的差异。值范围通常是非负数。
    • 结果:result_chisqr 表示两个直方图的卡方得分。
    • 解释:如果结果接近 0,则表示两个直方图非常相似;如果结果较大,则表示两个直方图差异较大。
  3. Intersection (交集):

    • 含义:交集比较方法衡量两个直方图的交集部分。值范围通常在 0 到 1 之间。
    • 结果:result_intersect 表示两个直方图的交集得分。
    • 解释:如果结果接近 1,则表示两个直方图高度重合;如果接近 0,则表示几乎没有重合。
  4. Bhattacharyya Distance (巴塔查里雅距离):

    • 含义:巴塔查里雅距离衡量两个概率分布之间的相似性。值范围通常是非负数。
    • 结果:result_bhattacharyya 表示两个直方图的巴塔查里雅距离。
    • 解释:如果结果接近 0,则表示两个直方图非常相似;如果结果较大,则表示两个直方图差异较大。
相关推荐
大写-凌祁3 小时前
零基础入门深度学习:从理论到实战,GitHub+开源资源全指南(2025最新版)
人工智能·深度学习·开源·github
焦耳加热3 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
深空数字孪生3 小时前
储能调峰新实践:智慧能源平台如何保障风电消纳与电网稳定?
大数据·人工智能·物联网
wan5555cn3 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
格林威4 小时前
机器视觉检测的光源基础知识及光源选型
人工智能·深度学习·数码相机·yolo·计算机视觉·视觉检测
今天也要学习吖5 小时前
谷歌nano banana官方Prompt模板发布,解锁六大图像生成风格
人工智能·学习·ai·prompt·nano banana·谷歌ai
Hello123网站5 小时前
glean-企业级AI搜索和知识发现平台
人工智能·产品运营·ai工具
AKAMAI5 小时前
Queue-it 为数十亿用户增强在线体验
人工智能·云原生·云计算
索迪迈科技5 小时前
INDEMIND亮相2025科技创变者大会,以机器人空间智能技术解锁具身智能新边界
人工智能·机器人·扫地机器人·空间智能·陪伴机器人
鹅毛在路上了5 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg