个人资料,仅供学习使用
修改时间——2022年2月14日 10:59:22
学习课程:OpenCV4 图像处理与视频分析实战教程
课程讲师:贾志刚
09 图像直方图+直方图均衡化+直方图比较
opencv知识点:
- 计算直方图数据 - calcHist
- 四舍五入浮点数 - cvRound
- 寻找最小/最大值 - minMaxLoc
- 均衡灰度图像的直方图 - equalizeHist
- 比较直方图 - compareHist
- 比较直方图的方法 - HistCompMethods
本课所解决的问题:
- 什么是图像直方图?
- 如何绘制彩色图像的一维直方图?
- 如何绘制HSV图像的二维直方图?
- 什么是图像直方图均衡化?
- 如何均衡化灰度图像的直方图?
- 如何均衡化彩色图像的直方图?
- 什么是直方图比较?
- 如何比较直方图?
1.图像直方图
直方图部分地方涉及了归一化,没有归一化基础可以阅读 18 图像像素类型转换与归一化,文章中非常详细。
关于图像直方图以及一维直方图的绘制,可以阅读 24 图像直方图,文章中非常详细。
关于二维直方图的绘制,可以阅读 25 二维直方图,文章中非常详细。
2.直方图均衡化
关于图像直方图的均衡化,可以阅读 26 直方图均衡化,文章中非常详细。
3.直方图比较
引用文章:
直方图比较的应用
当我们计算完两个图像的直方图后,可以对它们进行对比,并通过对比的结果得到一些结论。
比如
-
图像相似度比较
如果我们有两张图像,并且这两张图像的直方图一样,或者有极高的相似度,那么在一定程度上,我们可以认为这两幅图是一样的,这就是直方图比较的应用之一。 -
分析图像之间关系
两张图像的直方图反映了该图像像素的分布情况,可以利用直方图比较,来分析两张图像的关系。
直方图比较的方法
对输入的两张图像计算得到直方图H1与H2,并归一化到相同的尺度空间
然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度,进而比较图像本身的相似程度。
计算标准不同,则计算所得的相似程度不同。
我们称这个标准为衡量直方图相似度的对比标准(比较方法),这里设其为d(H1,H2)。
常用的比较方法有四种:
- 相关性比较(Correlation)——
CV_COMP_CORREL
- 卡方比较(Chi-Square)——
CV_COMP_CHISQR
- 十字交叉性(Intersection)——
CV_COMP_INTERSECT
- 巴氏距离(Bhattacharyya distance)——
CV_COMP_BHATTACHARYYA
更多的比较方法可查阅OpenCV4官方文档
四种方法的原理
相关性比较
相关性比较的公式如下:
-
如果H1 = H2,即两个图的直方图一样,分子等于分母,值为1,所以在不严格的情况下,当值为1时,可以认为两个图是一样的。
-
但是也有可能会出现两个图不一样,而两个图的直方图是一样的情况。
因为直方图计算的是像素点个数的分布情况,但是不会显示像素点的位置,所以有可能会出现两幅图片不一样,但是相同像素的个数完全一样,那他们的直方图也是一样的。
不过这种情况,不常有。
相关性比较公式来源于统计学中的相关系数,一般用字母 r 表示。
其中,Cov(X,Y)为X与Y的协方差,sigma[X]为X的标准差,sigma[Y]为Y的标准差。r取值范围[-1,1]
相关系数适合数值与数值之间的关联性分析。
如果两个变量的相关性越强,相关系数就会越接近±1,相关性越弱,相关系数越接近0。
也就是说:
- 相关性比较的值越趋近于0,相似度越低
- 相关性比较的值越趋近于1,相似度越高
卡方比较
卡方比较的公式如下:
通过这个公式我们能够发现,卡方比较和相关性比较恰恰相反,
- 卡方比较的值越趋近于1,相似度越低
- 卡方比较的值越趋近于0,相似度越高
值为0时说明H1= H2,这个时候相似度最高。
卡方比较来源于卡方检验,卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,
实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,
- 卡方值越大,越不符合
- 卡方值越小,偏差越小,越趋于符合,
- 若两个值完全相等时,卡方值就为0,表明理论值完全符合。
十字交叉性
十字交叉性的公式如下:
这个就比较简单了,对比H1,H2并求出最小值,最后求和。
巴氏距离
巴氏距离的公式如下:
在直方图相似度计算时,巴氏距离获得的效果最好,但计算是最为复杂的。
巴氏距离和相关性比较类似:
- 巴氏距离的值越趋近于0,相似度越低
- 巴氏距离的值越趋近于1,相似度越高
也就是说:巴氏距离的计算结果,其值完全匹配为1,完全不匹配则为0。
直方图比较演示
现在先介绍一下要用到的API
- compareHist
compareHist
compareHist
比较两个直方图
共3个参数
第1个参数 直方图H1
第2个参数 直方图H2
H1和H2大小要相同,要事先归一化
第3个参数 比较方法(查阅官方文档可知)
比较之前, 一定要先对它们进行归一化处理,因为归一化后的比较才有意义。
本课中演示的直方图比较为BGR色彩空间,采取方式为
- 计算图像的直方图,并归一化到[0~1]之间
- 计算图1和图2、图1和图1的相关性和巴氏距离
也可以用cvtColor()把图像从BGR转换到HSV等其他色彩空间,转换后其他地方一一对应即可
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void hist_compare() {
Mat src1 = imread("D:/WorkSpace/Opencv/images/h