文章目录
一、直方图比较
对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度,进而比较图像本身的相似程度。
Opencv提供的比较方法有四种:
- Correlation相关性比较 相关性程度 = (1,-1) ,为1时相关性最强
- Chi-Square卡方比较 (越接近0,两个直方图越相似)
- Intersection十字交叉性 (取两个直方图每个相同位置的值的最小值,然后求和,这个比较方式不是很好,不建议使用)
- Bhattacharyya distance巴氏距离 (比较结果是很准的,计算结果范围为 0-1 ,0表示两个直方图非常相关,1最不相似)
计算公式
其中N是直方图的BIN个数,
- 相关性计算(CV_COMP_CORREL)
- 卡方计算(CV_COMP_CHISQR)
- 十字计算(CV_COMP_INTERSECT)
- 巴氏距离计算(CV_COMP_BHATTACHARYYA )
- 颜色空间转换BGR2HSV:
计算图像的直方图,然后归一化到[0~1]之间(calcHist和normalize;)
InputArray h1, // 直方图数据,下同
InputArray H2,
int method // 比较方法,上述四种方法之一
)
头文件 quick_opencv.h:声明类与公共函数
主函数调用该类的公共成员函数
源文件 quick_demo.cpp:实现类与公共函数
效果演示
对测试图片进行光影调整后分别保存为test1,test2副本后测试:
比较方法:HISTCMP_CORREL
比较方法:HISTCMP_CHISQR
比较方法:HISTCMP_INTERSECT
比较方法:HISTCMP_BHATTACHARYYA
二、直方图反向投影
反向投影是反映直方图模型在目标图像中的分布情况
简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型。
一般检查流程
- 加载图片imread
- 将图像从RGB色彩空间转换到HSV色彩空间cvtColor
- 计算直方图和归一化calcHist与normalize
- Mat与MatND其中Mat表示二维数组,MatND表示三维或者多维数据,此处均可以用Mat表示。
- 计算反向投影图像 - calcBackProject
共三个重载函数,我这里只列出一个
void calcBackProject( const Mat* images, 输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种
int
nimages, 输入图像的数量
const int*
channels, 用于计算反向投影的通道列表,通道数必须与直方图维度相匹配
InputArray
hist, 输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse)
OutputArray
backProject, 目标反向投影输出图像,是一个单通道图像
const float**
ranges, 方图中每个维度bin的取值范围
double
scale = 1, 可选输出反向投影的比例因子
bool
uniform = true 直方图是否均匀分布(uniform)的标识符,有默认值true
)
使用效果:
使用 trackbar 详情
使用trackbar, 代码有问题,请教大佬。