图像处理--角点检测

角点及角点检测

角点是图像的一种重要局部特征,它决定了图像中目标的形状,所以在图像匹配、
目标描述与识别以及运动估计、目标跟踪等领域,角点提取具有十分重要的意义。在计
算机视觉和图像处理中,对于角点的定义有着不同的表述,其具体定义和描述主要有如
下几种: 
①角点是一阶导数的局部最大值所对应的像素点; 
②角点是指两条以上的边缘的交点; 
③角点指示了物体边缘变化不连续的方向; 
④角点处的一阶导数最大,而且高阶导数为零; 
⑤角点处不仅梯度的数值大,而且梯度方向的变化率也很大。也就是说,角点指示
了图像在二维空间内灰度变化剧烈的位置,是和周围的邻点有着明显差异的像素点。

 
第一类定义不能准确地定位角点,当检测到边缘时其一阶导数均局部最大,虽然能
较好的区分边缘和灰度平滑区域,但没有考虑角点处的曲率,故不能区分边缘与角点;
第二类定义不够准确,不易于数学表达,定义太抽象;第三类考虑到了角点处曲率的变
化与边缘处的不同,为更准确的角点定义奠定了基础;第四类定义不够准确,不能很好
的区分角点、边缘、平滑区域,不易于数学描述;第五类定义既考虑了梯度的局部最大
(角点也是边缘点的一部分),又考虑了梯度方向的变化率(只有当梯度方向剧烈变化时才
指示为角点)。
从上述描述可知第五类定义利用灰度信息,计算曲率和梯度能很好的区分角点、边缘与平滑区域,且易于数学表达。由于在实际工作中不需要提取边缘,因此得到了广泛的应用。
 

角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。

基于灰度图像的角点检测又可分为基于梯度、基于模板和基于模板梯度组合3类方法,其中基于模板的方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够大的点定义为角点。常见的基于模板的角点检测算法有Kitchen-Rosenfeld角点检测算法,Harris角点检测算法、KLT角点检测算法及SUSAN角点检测算法。和其他角点检测算法相比,SUSAN角点检测算法具有算法简单、位置准确、抗噪声能力强等特点。



角点检测算法

1.FAST算法

          1.1定义

Rosten等人将FAST角点定义为:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点。也就是某些属性与众不同,考虑灰度图像,即若该点的灰度值比其周围领域内足够多的像素点的灰度值大或者小,则该点可能为角点。

其中I(x)为圆周上任意一点的灰度,I(p)为圆心的灰度,Ed为灰度值差得阈值,如果N大于给定阈值,一般为周围圆圈点的四分之三,则认为p是一个特征点。
为了获得更快的结果,还采用了额外的加速办法。如果测试了候选点周围每隔90度角的4个点,应该至少有3个和候选点的灰度值差足够大,否则则不用再计算其他点,直接认为该候选点不是特征点。候选点周围的圆的选取半径是一个很重要的参数,这里我为了简单高效,采用半径为3,共有16个周边像素需要比较。为了提高比较的效率,通常只使用N个周边像素来比较,也就是大家经常说的FAST-N。我看很多文献推荐FAST-9,作者的主页上有FAST-9FAST-10FAST-11FAST-12,大家使用比较多的是FAST-9FAST-12。上个图说明的更形象一些。
图像处理--角点检测_第1张图片

      1.2fast算法实现步骤

  1. 从图片中选取一个像素$P$,下面我们将判断它是否是一个特征点。我们首先把它的亮度值设为$I_p$。
  2. 设定一个合适的阈值$t$。
  3. 考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素(如图1所示)。
  4. 现在,如果在这个大小为16个像素的圆上有$n$个连续的像素点,它们的像素值要么都比$I_p + t$大,要么都比$I_p - t$小,那么它就是一个角点。(如图1中的白色虚线所示)。$n$的值可以设置为12或者9,实验证明选择9可能会有更好的效果。

上面的算法中,对于图像中的每一个点,我们都要去遍历其邻域圆上的16个点的像素,效率较低。我们下面提出了一种高效的测试(high-speed test)来快速排除一大部分非角点的像素。该方法仅仅检查在位置1,9,5和13四个位置的像素,首先检测位置1和位置9,如果它们都比阈值暗或比阈值亮,再检测位置5和位置13。如果$P$是一个角点,那么上述四个像素点中至少有3个应该必须都大于$I_p+t$或者小于$I_p-t$,因为若是一个角点,超过四分之三圆的部分应该满足判断条件。

如果不满足,那么$p$不可能是一个角点。对于所有点做上面这一部分初步的检测后,符合条件的将成为候选的角点,我们再对候选的角点,做完整的测试,即检测圆上的所有点。

上面的算法效率实际上是很高的,但是有点一些缺点:

  1. 当$n<12$时不能拒绝许多的候选点;
  2. 检测出来的角点不是最优的,这是因为它的效率取决于问题的排序与角点的分布;
  3. 对于角点分析的结果被丢弃了;
  4. 多个特征点容易挤在一起。

1.3采用非极大值抑制

从邻近的位置选取了多个特征点是另一个问题,我们可以使用Non-Maximal Suppression来解决。

  1. 为每一个检测到的特征点计算它的响应大小(score function)$V$。这里$V$定义为点$p$和它周围16个像素点的绝对偏差的和。
  2. 考虑两个相邻的特征点,并比较它们的$V$值。
  3. $V$值较低的点将会被删除。

1.4fast算法在opencv实现

在OpenCV中进行FAST特征提取的函数为FAST。它一共有4个参数,第一个参数是输入的图像,第二个是返回的特征点,第三个是定义的阈值,第四个决定是否使用非极大值抑制。


void FAST(InputArray image,vector& keypoints,int threshold,boolnonmaxSuppression=true )
 
C++:void FASTX(InputArray image,vector& keypoints,int threshold,boolnonmaxSuppression, int type)
另外还有一个接口为FASTX,它提供了第五个参数type用来指定FAST检测中像素邻域圆的参数:TYPE_9_16TYPE_7_12TYPE_5_8

OpenCV里对FAST的使用也非常简单,先声明一组特征点,构建FAST特征检测,接下来调用detect函数检测图像中的特征点,最后把特征点绘制到图片上。上代码说的清楚些。
#include   
#include   
#include   
  
#include   
  
using namespace cv;  
  
void main()  
{  
    Mat image;  
    image = imread("church01.jpg");  
    // vector of keyPoints  
    std::vector keyPoints;  
    // construction of the fast feature detector object  
    FastFeatureDetector fast(40);   // 检测的阈值为40  
    // feature point detection  
    fast.detect(image,keyPoints);  
    drawKeypoints(image, keyPoints, image, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG);  
    imshow("FAST feature", image);  
    cvWaitKey(0);  
} 
图像处理--角点检测_第2张图片        图像处理--角点检测_第3张图片

      1.5fast算法总结

FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值$t$。

 

而且FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。




你可能感兴趣的:(图像处理)