千家信息网

C++ OpenCV如何实现直方图比较

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍C++ OpenCV如何实现直方图比较,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!直方图比较对输入的两个图像计算得到直方图H1和H2,归一化到相同的尺度空间,
千家信息网最后更新 2026年11月01日C++ OpenCV如何实现直方图比较

这篇文章主要介绍C++ OpenCV如何实现直方图比较,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

直方图比较

对输入的两个图像计算得到直方图H1和H2,归一化到相同的尺度空间,然后可以通过计算H1与H2之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。

OpenCV 提供了四种比较方法:

Correlation 相关性比较

Chi-Square 卡方比较

Intersection 十字交叉比较

Bhattacharyya 巴氏距离比较

相关API cv::compareHist

代码

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
#include

using namespace std;
using namespace cv;

/** @函数 main */
int main( int argc, char** argv )
{
Mat src_base, hsv_base;
Mat src_test1, hsv_test1;
Mat src_test2, hsv_test2;
Mat hsv_half_down;

/// 装载三张背景环境不同的图像
if( argc < 4 )
{ printf("** Error. Usage: ./compareHist_Demo \n");
return -1;
}

src_base = imread( argv[1], 1 );
src_test1 = imread( argv[2], 1 );
src_test2 = imread( argv[3], 1 );

/// 转换到 HSV
cvtColor( src_base, hsv_base, CV_BGR2HSV );
cvtColor( src_test1, hsv_test1, CV_BGR2HSV );
cvtColor( src_test2, hsv_test2, CV_BGR2HSV );

hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );

/// 对hue通道使用30个bin,对saturatoin通道使用32个bin
int h_bins = 50; int s_bins = 60;
int histSize[] = { h_bins, s_bins };

// hue的取值范围从0到256, saturation取值范围从0到180
float h_ranges[] = { 0, 256 };
float s_ranges[] = { 0, 180 };

const float* ranges[] = { h_ranges, s_ranges };

// 使用第0和第1通道
int channels[] = { 0, 1 };

/// 直方图
MatND hist_base;
MatND hist_half_down;
MatND hist_test1;
MatND hist_test2;

/// 计算HSV图像的直方图
calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );
normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );

calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false );
normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );

calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );
normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );

calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false );
normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );

///应用不同的直方图对比方法
for( int i = 0; i < 4; i++ )
{ int compare_method = i;
double base_base = compareHist( hist_base, hist_base, compare_method );
double base_half = compareHist( hist_base, hist_half_down, compare_method );
double base_test1 = compareHist( hist_base, hist_test1, compare_method );
double base_test2 = compareHist( hist_base, hist_test2, compare_method );

printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 );
}

printf( "Done \n" );

return 0;
}


输出的结果

以上是"C++ OpenCV如何实现直方图比较"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

直方图 图像 通道 C++ 不同 相似 两个 内容 方法 程度 篇文章 范围 相同 之间 代码 价值 兴趣 函数 十字 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 博彦科技互联网金融 互联网科技产业 互联网与未来科技 阿里巴巴算科技企业还是互联网 互联网科技实习生岗位职责 金融科技与互联网金融相同和不同 中化能源互联网科技招聘 青岛科技大学互联网大赛研究生 互联网与医疗科技 呼和浩特新华互联网科技学院 西安小鹰速贷互联网科技有限公司 特约风豹互联网科技为什么扣费 南博望互联网科技有限公司 雨阳互联网卡科技有限公司 互联网科技数字货币 广州有谷有贝互联网科技有限公司 普陀区互联网教育科技管理办法 容联科技互联网电商 深圳互联网科技园地址 广州全民伙伴互联网科技有限公司 瑰夏咖啡 镁科技互联网资讯平台 山东吉时兔互联网科技有限公司 厦门千工互联网科技有限公司 语蝶互联网科技有限公司 玉溪互联网科技怎么选 搜狐科技互联网 小米互联网科技园入驻 城市宝互联网科技有限公司 互联网与数字科技关系
0