FAST特征点检测算法

一、FAST算法简介
  如今,特征点检测的算法有很多,从最初的Moravec,到Harris,再到SIFT、SUSAN、GLOH、SURF算法,可以说特征点提取算法层出不穷。各种改进算法PCA-SIFT、ICA-SIFT、P-ASURF、R-ASURF、Radon-SIFT等也是搞得如火如荼。其中上面的算法如SIFT、SURF提取到的特征效果非常好(有较强的不变性),但是时间消耗依然很大,而在一个系统中,特征提取仅仅是一部分,还需要进行诸如配准、提纯、融合等后续算法。这使得系统的实时性变差,降系了系统性能。所以FAST算法的提出就是为了解决系统检测的实时性问题。
  2006年,Edward Rosten和Tom Drummond在《Machine learning for high-speed corner detection》中提出了一种FAST特征点检测算法,并在2010年稍作修改后发表了《Features From Accelerated Segment Test》,简称FAST算法。需要强调的是FAST算法只是一种特征点检测算法,并不涉及特征点的特征描述。具体的特征点描述可以通过其它算法来实现。

二、FAST算法主要内容
1、FAST特征角点
  在理解具体算法之前先了解FAST特征角点的概念,如果某点的像素与其周围邻域内足够多的其它点的像素相差较大,则该点可能是角点。
2、FAST算法实现的具体步骤如下:
  (1)在图像中任选一点p, 假定其像素(亮度)值为 Ip
  (2)以p点为中心,以3为半径画圆,圆上有16个像素,如下图所示:

FAST特征点检测算法_第1张图片

  (3)定义一个阈值。计算p1、p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接丢弃;否则,当做候选点,进行下一步判断;
  (4)若p是候选点,则计算p1、p5、p9、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,进行下一步判断;否则,直接丢弃;
  (5)若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点;否则,直接丢弃。
  (6)对图像进行非极大值抑制:判断以特征点p为中心的一个邻域(如3x3或5x5)内是否有多个特征点,如果有多个特征点,则分别计算各个特征点的FAST得分值(即s值,为16个点与中心差值的绝对值总和),如果p是领域所有特征点中s值最大的,则保留这个特征点,否则丢弃掉。如果领域内只有一个特征点,则将这个特征点进行保留,不参与别的计算。其中上面用到的得分计算公式如下(公式中用V表示得分,t表示阈值):

这里写图片描述

  由上可以看出,FAST算法实现起来简单,这也就是它为什么这么快速的原因,它也因为其速度快而著称。

三、利用OpenCV实现的FAST实例
1、代码

#include  
#include  
#include  
#include 

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat img = imread("1.jpg"); //读取图片
    std::vector keypoints;
    FAST(img, keypoints, 10); //调用FAST算法,10为阈值
    //-- Draw keypoints 
    Mat img_keypoints;
    drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    //-- Show detected (drawn) keypoints 
    imshow("Keypoints", img_keypoints);

    waitKey(0);
    return 0;
}

2、运行结果
  (1)原图

FAST特征点检测算法_第2张图片

  (2)FAST特征点检测

FAST特征点检测算法_第3张图片

四、总结
  FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值tt。而且FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。

你可能感兴趣的:(FAST特征点检测算法)