OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist()

参考博客:
反向投影backproject的直观理解
opencv 反向投影
颜色直方图的计算、显示、处理、对比及反向投影

一、概述

1、官方解释:反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式。简单的讲,
1)就是首先计算某一特征的直方图模型;(特征可以为色调+饱和度、灰度值等等)
2)然后使用模型去寻找图像中存在的该特征。例如,你有一个肤色直方图(Hue-Saturation直方图),你可以用它(色调和饱和度)来寻找图像中的肤色区域:

2、反向投影图就是图像对应位置像素的数量统计,也可以看做是密度统计。 反向投影图在某一位置(点)的值是原图对应位置(点)的像素值所在原图区间(bins)的总数目。(所以,一个区间点越多,在反向投影矩阵中就越亮。)

3、反向投影中的“反向”指的是从直方图值到反向投影矩阵映射的过程。

4、通过反向投影,原始的图像被简化了,而这个简化的过程实际上就是提取出图像的某个特征。所以我们就可以用这个特征来对比两幅图,如果两幅图的反向投影矩阵相似或相同,那么我们就可以判定这两幅图这个特征是相同的。

5、反向投影的作用:
反向投影用于在输入图像(通常较大)中查找**特定图像(通常较小或者仅1个像素,以下将其称为模板图像)**最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。如图:
在这里插入图片描述

第一个图为源图像,中间的那个小图像是产生用于反向投影的直方图的图像,最后的用直方图均衡化后的结果图像,可以看到,苹果的像素位置几被找到了。

二、calcBackProject()函数

calcBackProject 的基本过程是:
1)拿到 特征图像 (或模板图像)
2)得到 特征图像的直方图
3)拿到测试图像,依据测试图像的每个像素的值,在特征图像的直方图中找到对应的值,然后将直方图的值赋给新的图像,backproject算法就完成了。

void cv::calcBackProject(   
const Mat* images		// 输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数 
int nimages				// 输入图像的数量 
const int* channels 	// 用于计算反向投影的通道列表,通道数必须与直方图维度相匹配,第一个数组的通道是从0到image[0].channels()-1, 
InputArray hist 		// 输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse) 
OutputArray backProject	// 目标反向投影输出图像,是一个单通道图像,与原图像有相同的尺寸和深度 
const float ranges**	// 直方图中每个维度bin的取值范围 
double scale=1:			// 可选输出反向投影的比例因子 
bool uniform=true:		// 直方图是否均匀分布(uniform)的标识符,有默认值true
)

三、CalcBackProjectPatch()函数

对于calcBackProjectPatch,整个是基于块的形式,利用直方图做匹配,类似于模板匹配,只不过这些模板转换为直方图,而原图中以某点为基准,抠出来作对比的部分也转换为直方图,两个直方图作匹配,匹配的结果作为此点的值。

结果会是一张概率图,概率越大的地方,代表此区域与模板的相似度越高。而且,当模板小于检测的目标时,得到的结果图也能反映出检测区域的形状。这个结果与模板匹配的结果很相似,但利用直方图的方式,就能去除光照变化、边缘遮挡,旋转等因素的影响。另外
基于块的反向投影。这种方法速度很慢,模版图像别弄的太大了。
例如:
1)当模板图像小与目标的时候,作为区域检测器,测试如下:可以找到手区域
在这里插入图片描述
2)当模板等于目标的时候,测试如下:输出图像,较亮的部分就是人的头部大致位置
在这里插入图片描述

详情参考:
opencv 直方图反向投影

函数原型:

void cvCalcBackProjectPatch( 
IplImage** image,   // 输入图像:是一个单通道图像数组,而非实际图像
CvArr* dst,         // 输出结果:是一个单通道32位浮点图像,它的宽度为W-w+1,高度为H-h+1,这里的W和H是输入图像的宽度和高度,w和h是模板图像的宽度和高度
CvSize patch_size,  // 模板图像的大小:宽度和高度
CvHistogram* hist,  // 模板图像的直方图:直方图的维数和输入图像的个数相同,并且次序要一致;例如:输入图像包含色调和饱和度,那么直方图的第0维是色调,第1维是饱和度
int method,         // 对比方式:跟直方图对比中的方式类似,可以是:CORREL(相关)、CHISQR(卡方)、INTERSECT(相交)、BHATTACHARYYA
float factor        // 归一化因子,一般都设置成1,否则很可能会出错;中文、英文以及各路转载的文档都错了,这个参数的实际类型是double,而
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值