FAST特征点检测算法

本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46898007

简介

        在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者。

        从最早期的Moravec,到Harris,再到SIFT、SUSAN、GLOH、SURF算法,可以说特征提取算法层出不穷。各种改进算法PCA-SIFT、ICA-SIFT、P-ASURF、R-ASURF、Radon-SIFT等也是搞得如火如荼,不亦乐乎。上面的算法如SIFT、SURF提取到的特征也是非常优秀(有较强的不变性),但是时间消耗依然很大,而在一个系统中,特征提取仅仅是一部分,还要进行诸如配准、提纯、融合等后续算法。这使得实时性不好,降系了统性能。

        Edward Rosten和Tom Drummond两位大神经过研究,于2006年在《Machine learning for high-speed corner detection》中提出了一种FAST特征点,并在2010年稍作修改后发表了《Features From Accelerated Segment Test》,简称FAST注意:FAST只是一种特征点检测算法,并不涉及特征点的特征描述。

FAST详解

FAST特征的定义

      FAST的提出者Rosten等将FAST角点定义为:若某像素与其周围邻域内足够多的像素点相差较大,则该像素可能是角点。

FAST算法的步骤


1、上图所示,一个以像素p为中心,半径为3的圆上,有16个像素点(p1、p2、...、p16)。

2、定义一个阈值。计算p1、p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接pass掉;否则,当做候选点,有待进一步考察;

3、若p是候选点,则计算p1、p9、p5、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,再进行下一步考察;否则,直接pass掉;

4、若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点;否则,直接pass掉。

5、对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x3或5x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用V表示得分,t表示阈值):


       上面是FAST-9,当然FAST-10、FAST-11、FAST-12也是一样的,只是步骤4中,超过阈值的个数不一样。FAST算法实现起来简单,尤其是以速度快著称。

       以上便是FAST特征检测的过程,清晰明了,而对于角点的定义也是做到了返璞归真,大师就是大师,还原本质的能力很强,估计以前这种简单想法被很多人忽略了。

实验

opencv代码

[cpp]  view plain  copy
  1. #include <opencv2/core/core.hpp>  
  2. #include <opencv2/features2d/features2d.hpp>  
  3. #include <opencv2/highgui/highgui.hpp>  
  4. #include <cv.h>  
  5. #include <vector>  
  6.   
  7. using namespace cv;  
  8. using namespace std;  
  9.   
  10. int main()  
  11. {  
  12.     Mat frame=imread("lena.jpg", 1);  
  13.     double t = getTickCount();//当前滴答数  
  14.     std::vector<KeyPoint> keyPoints;  
  15.     FastFeatureDetector fast(50);   // 检测的阈值为50  
  16.   
  17.     fast.detect(frame, keyPoints);  
  18.     drawKeypoints(frame, keyPoints, frame, Scalar(0,0,255), DrawMatchesFlags::DRAW_OVER_OUTIMG);  
  19.       
  20.     t = ((double)getTickCount() - t)/getTickFrequency();  
  21.     cout<<"算法用时:"<<t<<"秒"<<endl;  
  22.   
  23.     imshow("FAST特征点", frame);  
  24.     cvWaitKey(0);  
  25.   
  26.     return 0;  
  27. }  
输出结果:

MATLAB代码

再上一个自己编写的MATLAB代码,没有进行非极大值抑制,效果不及opencv,而且检测出的角点有一定的出入,应该是opencv内部做了一定的优化。

[cpp]  view plain  copy
  1. clear all;  
  2. close all;  
  3. %%  
  4. pic=imread('lena.jpg');  
  5. img=pic;  
  6. [M N D]=size(pic);  
  7. if D==3  
  8.     pic=rgb2gray(pic);  
  9. end  
  10. %%  
  11. mask=[0 0 1 1 1 0 0;...  
  12.       0 1 0 0 0 1 0;...  
  13.       1 0 0 0 0 0 1;...  
  14.       1 0 0 0 0 0 1;...  
  15.       1 0 0 0 0 0 1;...  
  16.       0 1 0 0 0 1 0;...  
  17.       0 0 1 1 1 0 0];  
  18. mask=uint8(mask);  
  19. threshold=50;  
  20. figure;imshow(img);title('FAST角点检测');hold on;  
  21. tic;  
  22. for i=4:M-3  
  23.     for j=4:N-3%若I1、I9与中心I0的差均小于阈值,则不是候选点  
  24.         delta1=abs(pic(i-3,j)-pic(i,j))>threshold;  
  25.         delta9=abs(pic(i+3,j)-pic(i,j))>threshold;  
  26.         if sum([delta1 delta9])==0  
  27.             continue;  
  28.         else  
  29.             delta5=abs(pic(i,j+3)-pic(i,j))>threshold;  
  30.             delta13=abs(pic(i,j-3)-pic(i,j))>threshold;  
  31.             if sum([delta1 delta9 delta5 delta13])>=3  
  32.                 block=pic(i-3:i+3,j-3:j+3);  
  33.                 block=block.*mask;%提取圆周16个点  
  34.                 pos=find(block);  
  35.                 block1=abs(block(pos)-pic(i,j))/threshold;  
  36.                 block2=floor(block1);  
  37.                 res=find(block2);  
  38.                 if size(res,1)>=12  
  39.                     plot(j,i,'ro');  
  40.                 end  
  41.             end  
  42.         end  
  43.     end  
  44. end  
  45. toc;  
  46. %%  
输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值