1. 什么是backproject?
2. backproject 有什么用?
3. 例证
1. 什么是backproject?
反向投影:opencv docs给出的概念是“一种记录给定图像中的像素点如何适应直方图模型像素分布的方式。简单的讲, 所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。”
第一句讲的是backproject的算法实质,但是不好理解,第二句好理解,但是只是重点讲了backproject的应用。 两句都提到了直方图的概念。
从图像到直方图,这个过程比较好理解。
而backproject正是反过来,由直方图到形成图像,算法步骤有点类似于直方图均衡化,只不过,直方图均衡化是将图像结果中的每个像素的值由一个地方搬到一个新地方(我对直方图均衡化的直观理解),而backproject是直接取直方图中的值,即以灰度为例,某种灰度值在整幅图像中所占面积越大,其在直方图中的值越大,backproject时,其对应的像素的新值越大(越亮),反过来,某灰度值所占面积越小,其新值就越小。
上面的backproject过程是:由源图像 ——> 直方图 ——> backproject图像
而backproject更常用的用途是:查找指定特征,正是第二句话的描述。 此时,backproject的基本过程是:
1. 拿到 特征图像 (或模板图像)
2. 得到 特征图像的直方图
3. 拿到源图像,依据源图像的每个像素的值,在特征图像的直方图中找到对应的值,然后将直方图的值赋给新的图像,backproject算法就完成了。
对于calcBackProjectPatch,整个是基于块的形式,利用直方图做匹配,类似于模板匹配,只不过这些模板转换为直方图,而原图中以某点为基准,抠出来作对比的部分也转换为直方图,两个直方图作匹配,匹配的结果作为此点的值。 结果会是一张概率图,概率越大的地方,代表此区域与模板的相似度越高。
而且,当模板小于检测的目标时,得到的结果图也能反映出检测区域的形状。
借用下别人的一张图:
source: http://www.cnblogs.com/zsb517/archive/2012/06/20/2556508.html
这个结果与模板匹配的结果很相似,但利用直方图的方式,就能去除光照变化、边缘遮挡,旋转等因素的影响。
2. backproject有什么用?
正如上面第二幅图图示,可以由模板特征(那个小黑窗口,是在hue窗口中心选取了一小块),在另外一幅图像中寻找对应的目标。
从另一方面来想,backproject的大部分应用时将复杂的等级或维度,利用统计的方式,映射到更简单的描述空间上去,这种思想在现代的信息处理每每有闪光的应用。。。
另外,meanshift中也有应用到backproject,这部分后续分析。
3. 例证
拿到源图像,由原图转为HSV空间,取Hue色彩通道,如hue窗口显示,本应该是彩色的,不过灰度显示出来不太像那么回事。统计直方图,上面图示中,直方图的等级为9. 再backproject到新的图像中。
相对于原来的例子, 增加了显示hue图像。
Mat handhue = hue; // hue(Rect(hue.rows/2-10, hue.cols/2-10, 20, 20)).clone();
imshow("handhue", handhue);
/// Get the Histogram and normalize it
calcHist( &handhue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false );
第二幅图
将handhue取值替换为hue图像的中心部分,作为特征图像
Mat handhue = hue(Rect(hue.rows/2-10, hue.cols/2-10, 20, 20)).clone(); // hue;