收入囊中
灰度图像的反向投影
彩色图像的反向投影
利用反向投影做object detect
葵花宝典
什么是反向投影?其实没有那么高大上!
在上一篇博文学到,图像可以获得自己的灰度直方图.
反向投影差不多是逆过程,由直方图得到我们的投影图。
过程如下:
根据模版图像,得到模版图像的灰度直方图.
对灰度直方图对归一化,归一化后是个概率分布,直方图的积分是1
根据概率分布的直方图,求输入图像的投影图,也就是对每一个像素点,我们根据灰度值,可以得到其概率
得到的投影图是介于[0,1]之间的,为了方便显示,要作相应的扩大,一般以255最常用
举个例子,我们取右边方框作模版图像
我们再来看下面的图:
先看after project,非常暗,因为概率直方图的值都非常小,要知道平均值1/255是多么小,扩大255倍也只有1...很黑
为了清楚显示,作了reverse操作,f[i]=255-f[i],after reverse就比较明显,其中,白色亮区域是低概率位置,比较暗的是高概率位置。
最后,进行了一次二值化
二值化后黑色的区域就可能是我们的模版匹配的地方,但是,这样的点太多了,改进的方法就是不用灰度投影,而采用彩色投影。
初识api
<dl></dl>
<dt></dt>
c++: void calcbackproject(const
mat* images, int nimages, const int* channels, inputarray hist, outputarray backproject, const float** ranges, double scale=1, bool uniform=true )
<dd></dd>
<col>
images – source arrays. they all should have the same depth, cv_8u or cv_32f ,
and the same size. each of them can have an arbitrary number of channels.
nimages – number of source images.
channels – the list of channels used to compute the back projection. the number of channels must match the histogram dimensionality. the first array channels are numerated from 0
to images[0].channels()-1 , the second array channels are counted from images[0].channels() to images[0].channels() + images[1].channels()-1,
and so on.
hist – input histogram that can be dense or sparse.
backproject – destination back projection array that is a single-channel array of the same size and depth as images[0] .
ranges – array of arrays of the histogram bin boundaries in each dimension. see .
scale – optional scale factor for the output back projection.
uniform – flag indicating whether the histogram is uniform or not (see above).
对于参数就不多作解释了,因为和计算直方图的参数几乎一摸一样,scale是个扩大系数,经常取255.我们通过下面的例子来进一步巩固。
荷枪实弹
刚才的那3个效果图大家都看到了,我就先拿出灰度反向投影的代码
这段代码比较简单,因为histogram1d这个类见了很多次了
之前有提到过,灰度反向投影太不准确,很多错误的点都被弄进来了,下面,我们实现彩色反向投影。
先介绍一个类,跟histogram1d很像,只不过是3d了 0 0
最需要注意的是colorreduce这个方法
假如div = 16,那么最后的单通道颜色只有16种。由256变成了16,也就是本来的256^3,缩小成了16^3
我们处理彩色图像前,最好先对颜色作color reduce.
我的想法是,因为原来的色彩太多了,256^3,范围太大,直方图概率函数会很小,可能就会发生难以预料的错误了,比如会造成基本相同的颜色却判断不一致。
我们再来看一个类
然后,看下我们的main函数
我们来看一下效果,先看原图,我们选取了左上角的蓝天作模版图
下面是二值化后的反向投影图,白色的就是我们的蓝天
如果不作二值化会怎么样》我们看一看图片
好像效果更不错,因为最上面的更蓝,概率大
下面一点的是淡蓝天空,所以图就有点灰,表示概率有点小
举一反三
刚接触back project时,我一直不知道它能干什么用...还以为只是个玩具tat
不仅能用rgb空间的直方图,还能用hsv空间去做meanshift.
计算机视觉讨论群:162501053
转载请注明:http://blog.csdn.net/abcd1992719g