天天看点

OpenCV2马拉松第10圈——直方图反向投影(back project)

收入囊中

灰度图像的反向投影

彩色图像的反向投影

利用反向投影做object detect

葵花宝典

什么是反向投影?其实没有那么高大上!

在上一篇博文学到,图像可以获得自己的灰度直方图.

反向投影差不多是逆过程,由直方图得到我们的投影图。

过程如下:

根据模版图像,得到模版图像的灰度直方图.

对灰度直方图对归一化,归一化后是个概率分布,直方图的积分是1

根据概率分布的直方图,求输入图像的投影图,也就是对每一个像素点,我们根据灰度值,可以得到其概率

得到的投影图是介于[0,1]之间的,为了方便显示,要作相应的扩大,一般以255最常用

举个例子,我们取右边方框作模版图像

OpenCV2马拉松第10圈——直方图反向投影(back project)

我们再来看下面的图:

先看after project,非常暗,因为概率直方图的值都非常小,要知道平均值1/255是多么小,扩大255倍也只有1...很黑

为了清楚显示,作了reverse操作,f[i]=255-f[i],after reverse就比较明显,其中,白色亮区域是低概率位置,比较暗的是高概率位置。

最后,进行了一次二值化

OpenCV2马拉松第10圈——直方图反向投影(back project)

二值化后黑色的区域就可能是我们的模版匹配的地方,但是,这样的点太多了,改进的方法就是不用灰度投影,而采用彩色投影。

初识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函数

我们来看一下效果,先看原图,我们选取了左上角的蓝天作模版图

OpenCV2马拉松第10圈——直方图反向投影(back project)

下面是二值化后的反向投影图,白色的就是我们的蓝天

OpenCV2马拉松第10圈——直方图反向投影(back project)

如果不作二值化会怎么样》我们看一看图片

OpenCV2马拉松第10圈——直方图反向投影(back project)

好像效果更不错,因为最上面的更蓝,概率大

下面一点的是淡蓝天空,所以图就有点灰,表示概率有点小

举一反三

刚接触back project时,我一直不知道它能干什么用...还以为只是个玩具tat

不仅能用rgb空间的直方图,还能用hsv空间去做meanshift.

计算机视觉讨论群:162501053

转载请注明:http://blog.csdn.net/abcd1992719g