直方图对比
原理
-
要比较两个直方图( 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直方图,并归一化以便对比。
- 将 基准图像 直方图与 两张测试图像直方图,基准图像半身像直方图,以及基准图像本身的直方图分别作对比。
- 显示计算所得的直方图相似度数值。
-
下载代码: 点击 这里
-
代码一瞥:
解释
-
声明储存基准图像和另外两张对比图像的矩阵( RGB 和 HSV )
-
装载基准图像(src_base) 和两张测试图像:
-
将图像转化到HSV格式:
-
同时创建包含基准图像下半部的半身图像(HSV格式):
-
初始化计算直方图需要的实参(bins, 范围,通道 H 和 S ).
-
创建储存直方图的 MatND 实例:
-
计算基准图像,两张测试图像,半身基准图像的直方图:
-
按顺序使用4种对比标准将基准图像(hist_base)的直方图与其余各直方图进行对比:
结果
-
使用下列输入图像:
第一张为基准图像,其余两张为测试图像。同时我们会将基准图像与它自身及其半身图像进行对比。
-
我们应该会预料到当将基准图像直方图及其自身进行对比时会产生完美的匹配, 当与来源于同一样的背景环境的半身图对比时应该会有比较高的相似度, 当与来自不同亮度光照条件的其余两张测试图像对比时匹配度应该不是很好:
-
下面显示的是结果数值:
对比标准 基准 - 基准 基准 - 半身 基准 - 测试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 标准, 值越大相似度越大。因此可以看到对于采用这两个方法的对比,*基准 - 基准* 的对比结果值是最大的, 而 基准 - 半身 的匹配则是第二好(跟我们预测的一致)。而另外两种对比标准,则是结果越小相似度越大。 我