moravec角点检测算法

一、Moravec角点检测算法原理

Moravec角点检测算法是最早的角点检测算法之一,虽然该算法有很多缺点而且实用性也很差,但是它是很多算法的基础,后面讲解的Harris算法就是基于该思想进行改进的。该算法将角点定义为具有低“自相关性”的。算法会检测图像的每一个像素,将像素周边的一个邻域作为一个窗口,并检测这个窗口和周围其他窗口的相关性。这种相关性通过两个窗口间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。如下图所示:如果像素位于平滑图像区域内,周围的窗口都会非常相似。如果像素在边缘上,则周围的窗口在与边缘正交的方向上会有很大差异,在与边缘平行的方向上则较为相似。而如果像素是各个方向上都有变化的特征点,则周围所有的窗口都不会很相似。Moravec会计算每个像素窗口和周围窗口的SSD最小值作为强度值,取局部强度最大的点作为特征点。

moravec角点检测算法_第1张图片

首先,计算每个像素点的兴趣值,即以该像素点为中心,取一个w*w(:5x5)的方形窗口,计算0度、45度、90度、135度四个方向灰度差的平方和,取其中的最小值作为该像素点的兴趣值。实际一些算法用水平或对角线上的一个方向灰度值差的平方和来近似代替。

3x3为例,黑色窗口为I(x,y) 红色窗口为I(x+u,y+v),其中四种移位(u,v)= (1,0), (1,1), (0,1), (-1, 1).w(x,y)为方形二值窗口,若像素点在黑色窗口内,则取值为1,否则为0

moravec角点检测算法_第2张图片

为了防止相邻两点由于灰度值差别不大而检测到多余的角点,采用局部极大值抑制算法来剔除假的角点。

Moravec角点检测算法缺点

经过测试,可以发现moravec的众多问题,重要的有:

1.对边缘点的反应比较强烈

下图中,是用3*3的窗口,对图像进行morave角点检测。虽然moravec算法能把所有角点都检测出来,但是把边缘上面的很多点也作为角点了,对于这种情况,我们应该是可以理解的。moravec算法对角点定义是:窗口在各个方向的移动,窗口内的灰度值都会产生较大的变化。而其实这里的“各个方向“,最多也就只有8个方向。所以,如果边缘的方向,是这8个方向以外的方向,那么,就会被认为是角点。

moravec角点检测算法_第3张图片

2.不具备旋转不变性

moravec算法不具备旋转不变性,因为moravec算法只计算最多八个方向的灰度值差的平方和,所以可能会出现原来的一条边缘在这8个方向之上而旋转之后却不在了,也有可能是相反的情况。这种旋转不变性进一步抑制了moravec算法的实用性。

moravec角点检测算法_第4张图片

moravec中,使用的窗口是正方形的,并且窗口值是二元的,在窗口内,窗口值是1,在窗口外,窗口值是0。为了达到精确估计局部灰度值的变化程度,圆形的窗口才是理想的。圆形的窗口,使得中心点到窗口的每一个边缘点的欧式距离基本是相等的。如图,左图是7*7窗口,右图是半径为7的圆形窗口,可以看出,对于圆形窗口,从中心点到各个边缘点之间的欧式距离更接近。这样更有利于评估局部灰度值的变化程度。为什么呢?评估局部灰度值的变化程度,注意这句话里的一个关键词局部,那么什么是局部?如果我们使用7*7的正方形窗口,那么这个正方形窗口就是局部,我们的评估局部灰度值的变化程度的时候,这49个元素都会参与运算;当我们使用半径为7的圆形窗口的时候,那么这个半径为7的圆形窗口就是局部,在这个圆形窗口内的灰度值都会参与运算。通常,我们认为,离中心点更近的点,对该点影响也会大一些。既然离得比较近的点对中心点的影响比较大,那么我们在评估局部灰度值的变化程度的时候,应该赋予离中心更近的点更大的权重才是合理的,而不是moravec使用的窗口值,只要在窗口内部,不管远近,权重都是1.通过上面的分析,既要使用圆形的窗口,又要赋予离中心更近的点更大的权重,那么高斯窗口就是比较好的一个选择了。5*5的高斯窗口如图所示:虽然看起来的也是方形的,但是它在四个角落上的权重是非常小的,可以近似的认为是0,那么就可以认为是一个圆形的窗口,并且,权重是离中心点越近变得越大。

moravec角点检测算法_第5张图片

后人就是根据这些不足与改进提出了很多算法,后面的Harris算法就是其中一个。

你可能感兴趣的:(opencv)