compareHist函数
直方图对比
目标
本文档尝试解答如下问题:
- 如何使用OpenCV函数 compareHist 产生一个表达两个直方图的相似度的数值。
- 如何使用不同的对比标准来对直方图进行比较。
原理
要比较两个直方图( and ), 首先必须要选择一个衡量直方图相似度的 对比标准 () 。
OpenCV 函数 compareHist 执行了具体的直方图对比的任务。该函数提供了4种对比标准来计算相似度:
Correlation ( CV_COMP_CORREL )
其中
是直方图中bin的数目。
Chi-Square ( CV_COMP_CHISQR )
Intersection ( CV_COMP_INTERSECT )
Bhattacharyya 距离( CV_COMP_BHATTACHARYYA )
源码
本程序做什么?
- 装载一张 基准图像 和 两张 测试图像 进行对比。
- 产生一张取自 基准图像 下半部的图像。
- 将图像转换到HSV格式。
- 计算所有图像的H-S直方图,并归一化以便对比。
- 将 基准图像 直方图与 两张测试图像直方图,基准图像半身像直方图,以及基准图像本身的直方图分别作对比。
- 显示计算所得的直方图相似度数值。
下载代码: 点击 这里
代码一瞥:
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h>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 <image_settings0> <image_setting1> <image_settings2>\n");return -1;}src_base = imread( argv[1], 1 );src_test1 = imread( argv[2], 1 );src_test2 = imread( argv[3], 1 );/// 转换到 HSVcvtColor( 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个binint h_bins = 50; int s_bins = 60;int histSize[] = { h_bins, s_bins };// hue的取值范围从0到256, saturation取值范围从0到180float 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;}
解释
声明储存基准图像和另外两张对比图像的矩阵( RGB 和 HSV )
Mat src_base, hsv_base; Mat src_test1, hsv_test1; Mat src_test2, hsv_test2; Mat hsv_half_down;
装载基准图像(src_base) 和两张测试图像:
if( argc < 4 ){ printf("** Error. Usage: ./compareHist_Demo <image_settings0> <image_setting1> <image_settings2>\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格式):
hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );
初始化计算直方图需要的实参(bins, 范围,通道 H 和 S ).
int h_bins = 50; int s_bins = 32; int histSize[] = { h_bins, s_bins };float h_ranges[] = { 0, 256 }; float s_ranges[] = { 0, 180 };const float* ranges[] = { h_ranges, s_ranges };int channels[] = { 0, 1 };
创建储存直方图的 MatND 实例:
MatND hist_base; MatND hist_half_down; MatND hist_test1; MatND hist_test2;
计算基准图像,两张测试图像,半身基准图像的直方图:
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() );
按顺序使用4种对比标准将基准图像(hist_base)的直方图与其余各直方图进行对比:
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 );}
结果
使用下列输入图像:
第一张为基准图像,其余两张为测试图像。同时我们会将基准图像与它自身及其半身图像进行对比。
我们应该会预料到当将基准图像直方图及其自身进行对比时会产生完美的匹配, 当与来源于同一样的背景环境的半身图对比时应该会有比较高的相似度, 当与来自不同亮度光照条件的其余两张测试图像对比时匹配度应该不是很好:
下面显示的是结果数值:
对比标准 基准 - 基准 基准 - 半身 基准 - 测试1 基准 - 测试2 Correlation 1.000000 0.930766 0.182073 0.120447 Chi-square 0.000000 4.940466 21.184536 49.273437 Intersection 24.391548 14.959809 3.889029 5.775088 Bhattacharyya 0.000000 0.222609 0.646576 0.801869 对于 Correlation 和 Intersection 标准, 值越大相似度越大。因此可以看到对于采用这两个方法的对比,*基准 - 基准* 的对比结果值是最大的, 而 基准 - 半身 的匹配则是第二好(跟我们预测的一致)。而另外两种对比标准,则是结果越小相似度越大。 我
compareHist函数相关推荐
- 利用OpenCV的compareHist函数作直方图的相似度对比的源程序
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 OpenCV的compareHist函数用来计算 ...
- OpenCV3学习(8.2)直方图相似度比较compareHist函数与EMD距离
对输入的两张图像进行直方图均衡化及直方图计算步骤后,可以对两个图像的直方图进行对比,两张图像的直方图反映了该图像像素的分布情况,可以利用图像的直方图,来分析两张图像的关系. 如果我们有两张图像,并且这 ...
- compareHist函数 例子
功能是:打开摄像头,鼠标选定一个框,框内图像作为标准图像,计算出其直方图并显示出来:然后继续鼠标选定框,该框内的图像的直方图与标准图像的进行相似度计算,计算结果在终端输出,数值越大表示相似度越大. o ...
- python compare函数_Python Opencv中用compareHist函数进行直方图比较对比图片
图像直方图 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图像是由像素 ...
- python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...
上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...
- OpenCV学习(二十) :直方图匹配、对比:calcHist(),minMaxLoc(),compareHist()
直方图匹配.对比:calcHist ,minMaxLoc,compareHist 1.calcHist()函数 2.归一化:normalize()函数 3.minMaxLoc()函数 4.compar ...
- 图片相相似度计算(Hash、SSIM、compareHist)
哈希相似度算法(Hash algorithm) 用一个快速算法,就达到基本的效果.哈希算法(Hash algorithm),它的作用是对每张图片生成一个固定位数的Hash 值(指纹 fingerpri ...
- 《OpenCV3编程入门》学习笔记9 直方图与匹配(三)直方图对比
9.3 直方图对比 9.3.1 对比直方图:compareHist()函数 1.作用: 比较两幅直方图 2.函数原型: (1)double compareHist(InputArray H1,In ...
- 【OpenCV 4开发详解】直方图操作
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
最新文章
- Multi task learning多任务学习背景简介
- Python基础教程,流程控制语句详解
- 汉字在线转化unicode编码
- 【华为云技术分享】LiteOS无法直接烧录或者烧录失败解决方法--ST-Link
- 【月薪三万】听说深圳老师工资全国最高!!!比德国还高
- RemoteApp登录到特定的域
- Java开发笔记(一百五十)C3P0连接池的用法
- 计算机网络医院拓扑图方案设计,【方案】某医院计算机网络综合布线系统设计...
- 最新消息,我的Zcash钱包收到鱼池的ZEC打款了
- 什么是平面设计?详细讲解平面设计
- win环境下jdk7与jdk8共存问题
- ubuntu 20.04中火狐浏览器安装flash插件
- 《2022年中国网络安全市场全景图》
- 几种常见的水下路由算法介绍
- 【linux内核分析与应用-陈莉君】内核同步措施
- javascript event bubbling and capturing (再谈一谈js的事件冒泡和事件补获,看到这篇文章加深了理解)...
- 8255A的工作方式
- axure RP文件如何找回_u盘文件丢失怎么办 u盘文件丢失恢复方法【步骤详解】
- 转载《利用Windows系统自带命令手工搞定病毒》_原水_新浪博客
- heif heic 的区别_什么是HEIF(或HEIC)图像格式?