在很多情况下,在两幅相似图像中如能找到到对应点对,将非常有利;当我们在考虑几何变换时,确定对应的位置后,就可以从实际数据中估计出反映几何变换的参数。一般来说,像素的所有可能对应都被检查,以解决对应问题,而这在计算上又非常耗时。如果两幅图像都有n个像素,若对应关系只在一个小多了的像素区域查找,则计算过程将可能大为简化。本节,我们选择典型兴趣点检测之Moravec检测器。
图像中的角点可使用局部检测器定位;角点检测器的输入为灰度图像,在输出图像中,像素值与原像素为角点的可能性成正比。通过对角点检测后的结果进行阈值化的处理,可得到兴趣点。在我们解决对应点问题时,角点的效果要好于线段。这是由光圈问题导致的。假设通过一小光圈,观测一个移运直线。这时,只有垂直于线段的运动分量才能被观察到时。与线段共线的分量则不可见。而用角点则要得多。如图5.34所示:
同时,边缘检测器在角点处并不稳定。当角点的梯度模糊时,这是很自然结果。如图5.35所示:
图中的解角点寻也可定义为小邻域内的像素,其中有两个不同的方边缘方向。和作为局部最大值或最小值的孤立点、线段端点,这一定义寻不精确。然而,这种检测器在文献中也称为角点检测器,并被广泛地使用。如果必须检测到角点,则需要增加一些额外的约束条件。在图像工程中,最简单的角点检测器是moravec检测器。
1977年,Moravec提出了兴趣点的概念,并应用于解决Stanford Cart的导航问题。1981年, Moravec在International Joint Conference on Artificial Intelligence发表了篇题为:Obstacle Avoidance and Navigation in the Real World by a Seeing Robot Rover的文章,并将其应用与立体匹配。Moravec检测器是高对比度的最大像素值。这些点都在角点或锐边处,Moravec操作MO定义如下:
Moravec的原理如果有一句话来说就是:通过滑动二值矩形窗口寻找灰度变化的局部最大值。其具体来说主要包括如下过程:
1.滑动窗口计算灰度变化
滑动窗口在现有的技术中已经有了很多应用,如模板匹配、目标检测(hog特征的行人检测)等。在Moravec算子中,一般窗口的大小取3×3、5×5、7×7等等,但是随着窗口的增大,计算量也就越大。Moravec算子通过对窗口的水平、垂直和对角八个方向进行移动(Horizontally、Vertically and four diagonals),计算原窗口与滑动窗口差的平方和来得到灰度的变化。我们进一步通过下图一个3×3的滑窗来进行说明:
上图中,红色框表示的是原始框,而蓝色框表示向右上的滑动框,白色框表示前景255,黑色框表示背景0。那么原始框和滑动框的灰度变化通过对应位置差的平方和来表示。同样,根据上式计算另外七个方向滑动框的灰度变化(水平向左、水平向右、垂直向上、垂直向下以及四个对角)。至此,我们就计算完成了8个方向的灰度变化,我们称此操作位Moravec算子。
2.构造角点性映射图
在构造角点映射图之前,我们先来分析下,通过上式的我们可以得到角点吗?或者凭什么通过计算两个框对应位置的差的平方和就可以检测到角点?问题问得好,我们来看下面的图:
上面四张图上的四个红色的框表示我们正在处理的窗,第一幅图中的窗在表示在目标内部或者是背景上,该区域灰度分布均与,通过对其在8个方向上灰度,灰度变化很小;第二幅图中的窗跨在图像的边缘处,当垂直于边缘方向滑动窗口时将会导致灰度的很大变化,而沿着边缘滑动窗时,灰度变化较小;第三幅图中的窗在角点处,不管往哪个方向滑动窗口,都会导致灰度的很大变化;而第四幅图中的框内是一个离散点,滑动窗向任意方向滑动也会导致灰度的很大变化。因此,通过上面的描述和分析,我们可以知道,Moravec算子可以作为一种角点性的度量,这种度量是通过求8个方向的滑窗来的最小值来表示。通过下图来描述角点映射图的构造:
上图中的是通过Moravec算子计算得到的,其中1表示1*255^2,2表示2*255^2。通过上图可以知道:
int GetMoravecCount(IplImage* src,CvSeq* corners , float threshold) { const int winSize=5; int x,y,halfWinSize=winSize/2; IplImage* diffDst = cvCreateImage(cvGetSize(src),32,1); cvZero(diffDst); int cornersCount=0; for(y=halfWinSize;y<src->height-halfWinSize;y++) { for(x=halfWinSize;x<src->width-halfWinSize;x++) { //compute the reaction in the four directions(0,45,90,135) int winx; float reaction[4],minValue; reaction[0]=0; reaction[1]=0; reaction[2]=0; reaction[3]=0; //0 度方向的变化量保存在reaction[0]中 for( winx=-halfWinSize;winx<halfWinSize;winx++) { reaction[0] = reaction[0]+pow(cvGetReal2D(src,y,x+winx) -cvGetReal2D(src,y,x+winx+1),2); } //45 度方向的变化量保存在reaction[1]中 for( winx=-halfWinSize;winx<halfWinSize;winx++) { reaction[1] = reaction[1]+pow(cvGetReal2D(src,y+winx,x+winx) -cvGetReal2D(src,y+winx+1,x+winx+1),2); } //90 度方向的变化量保存在reaction[2]中 for( winx=-halfWinSize;winx<halfWinSize;winx++) { reaction[2] = reaction[2]+pow(cvGetReal2D(src,y+winx,x) -cvGetReal2D(src,y+winx+1,x),2); } //135 度方向的变化量保存在reaction[3]中 for( winx=-halfWinSize;winx<halfWinSize;winx++) { reaction[3] = reaction[3]+pow(cvGetReal2D(src,y+winx,x-winx) -cvGetReal2D(src,y+winx+1,x-winx-1),2); } minValue = reaction[0]; minValue = minValue > reaction[1] ? reaction[1] : minValue; minValue = minValue > reaction[2] ? reaction[2] : minValue; minValue = minValue > reaction[3] ? reaction[3] : minValue; cvSetReal2D(diffDst,y,x,minValue); } } for(y=halfWinSize;y<src->height-halfWinSize;) { for(x=halfWinSize;x<src->width-halfWinSize;) { float max=0; int flag = 0 ; CvPoint maxLoc; maxLoc.x = -1; maxLoc.y = -1; for(int winy=-halfWinSize;winy<=halfWinSize;winy++) { for(int winx=-halfWinSize;winx<=halfWinSize;winx++) { float value ; value = cvGetReal2D(diffDst,y+winy,x+winx); if(value>max) { max = value; maxLoc.x = x+winx; maxLoc.y = y+winy; flag = 1; } } } if(flag==1 && max>threshold) { cvSeqPush(corners,&maxLoc); cornersCount++; } x=x+halfWinSize; } y=y+halfWinSize; } cvReleaseImage(&diffDst); return cornersCount; }
从上图也可以看到,Moravec算子对角点的检测效果还不错,但是对于对角线上的角点容易出现误检。Moravec算子作为第一个广泛应用的角点检测算法,开创了角点检测的新纪念,后续的很多角点检测算子都是在其基础上通过扩展得到的。但是Moravec算子也存在诸如方向各异性、噪声敏感、对旋转不具备不变形(角点不具备repeatability)、滑动窗内的各个像素权重同质性(中心像素权重大,离中心越远,权重越小)。
[1] Svoboda T.nKybic J., and Hlavac V. "Image Processing Analysis and Machine Vision". Thomson Engineering 2008.
[2] Zuniga, O.A., Haralick, and R.M."Corner Detection using the Facet Model",In Proc. Conf. Computer Vision and Pattern Recognition,1983
[3] Hans Moravec, "Rover Visual Obstacle Avoidance," proceedings of the seventh International Joint Conference on Artificial Intelligence, August, 1981, pp. 785–790.
[4] Helpful Moravec Explanation by Donovan Parks and Jean-Philippe Gravel"Moravec Operator"(Moravec算子的更细节内容)
关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.
=========================================================