opencv第七章-直方图与匹配(2)

来源:互联网 发布:万家灯火软件 编辑:程序博客网 时间:2024/05/18 15:07

opencv第七章-直方图与匹配(2)

(1)对比两个直方图

然而,对于直方图来说,另一个不可或缺的工具是用某些具体的标准来比较两个直方图的相似度。

double cvCompareHist(const CvHistogram* hist1, const CvHistogram* hist2, int method)

前两个参数是要比较的大小相同的直方图,第三个变量是所选择的距离标准,有4种选择。分别是相关,卡方,相交和Bhattacharyya距离。


(2)陆地移动距离(EMD)

光线变化能引起图像颜色值的漂移,尽管这些漂移没有改变颜色直方图的形状,但是这些漂移引起了颜色值位置的变化,从而导致前述匹配策略的失效。如果利用直方图的距离测量来代替直方图的匹配策略,那么我们仍然可以像直方图对比一样对比两个直方图的距离,即使第二个直方图发生漂移,也能找到最小的距离度量。陆地移动距离(EMD)是一种度量准则;它实际上度量的是怎样将一个直方图的形状转换为另一个直方图的形状,包括移动直方图的部分(或全部)到一个新的位置,可以在任何维的直方图上进行这种度量。


EMD算法本身是个通用算法,它允许用户自己设置距离度量或者自己的移动代价矩阵。用户可以记录直方图“素材”从一个直方图什么位置滚动到另一个直方图后,也可以利用此前数据信息所产生的非线性距离度量。

float cvCalcEMD2(const CvArr* signature1, const CvArr* signature2, int distance_type,

CvDistanceFunction distance_func =NULL, const CvArr* cost_matrix=NULL, CvArr* flow=NULL,

float* lower_bound=NULL,void * userdata=NULL)


简单的EMD接口:

float cvCalcEMD2(const CvArr* signature1,const CvArr* signature2, int distance_type)


(3)反向投影

反向投影是一种记录像素点或像素块如何适应直方图模型中分布的方式。例如:我们有一个颜色直方图,可以利用反向投影在图像中找到该区域。需要执行如下查找:

void cvCalcBackProject(IplImage** image,CvArr* back_project, const CvHistogram* hist)


(4)基于块的反向投影

我们可以用基本的back_project方法来为一个特定像素是否可能是一个特定目标类型的成员(以一个直方图为该目标类型的模型)建模。这与某个特定目标是否存在的概率计算不完全相同。另一种方法是考虑图像子区域以及子区域的特征(比如颜色)直方图,并且想知道子区域特征的直方图是否与模型的直方图匹配。然后,我们把每一个这样的子区域与目标是否位于该子区域的概率联系起来。


因此,正如我们可以用函数cvCalcBackProject计算一个像素是否是一个已知目标的一部分,也可以用函数cvCalcBackProjectPatch计算一块区域是否包含已知的目标。函数cvCalcBackProjectPatch在整个输入图像使用一个滑动窗口。在输入图像矩阵的每一个位置,快中所有的像素点都被设置为在目标图像中对应的块中心位置的像素点。这一点非常重要,因为图像的许多特性(如纹理)在单一的像素级别上无法确定,但可以从一组像素确定。


反向投影。使用在输入图像平面上的滑动块来设置目标图像上相应的像素(块的中心);对于归一化直方图模型来说,结果图像可以被解析为一个概率图,它表示目标是否可能出现。


反向投影函数:

void cvCalcBackProjectPatch(IplImage** images,CvArr* dst,CvSzie patch_size,

CvHistogram* hist,int method,float factor)


(5)模板匹配

通过cvMatchTemplate做模板匹配不是基于直方图的;事实上,使用本节介绍的匹配方法之一,通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。

void cvMatchTemplate(const CvArr* image,const CvArr* templ, CvArr* result, int method)




0 0
原创粉丝点击