图像处理之FAST特征点检测
2019-04-15 13:18 发布
生成海报
简介 在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者。 从最早期的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、p5、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选角点,再进行下一步考察;否则,不可能是角点; 3、 若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少连续 9个超过阈值,则是角点;否则,不可能是角点。4、 对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x3或5x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用V表示得分,t表示阈值): 上面是FAST-9,当然FAST-10、FAST-11、FAST-12也是一样的,只是步骤3中,超过阈值的个数不一样。FAST算法实现起来简单,尤其是以速度快著称。 以上便是FAST特征检测的过程,清晰明了,而对于角点的定义也是做到了返璞归真,大师就是大师,还原本质的能力很强,估计以前这种简单想法被很多人忽略了。 实验 opencv代码 [cpp] view plain copy #include #include #include #include #include using namespace cv; using namespace std; int main() { Mat frame=imread("lena.jpg" , 1); double t = getTickCount(); std::vector keyPoints; FastFeatureDetector fast(50); fast.detect(frame, keyPoints); drawKeypoints(frame, keyPoints, frame, Scalar(0,0,255), DrawMatchesFlags::DRAW_OVER_OUTIMG); t = ((double )getTickCount() - t)/getTickFrequency(); cout<<"算法用时:" <"秒" < imshow("FAST特征点" , frame); cvWaitKey(0); return 0; } 输出结果: MATLAB代码 再上一个自己编写的MATLAB代码,没有进行非极大值抑制,效果不及opencv,而且检测出的角点有一定的出入,应该是opencv内部做了一定的优化。 [cpp] view plain copy clear all; close all; %% pic=imread('lena.jpg' ); img=pic; [M N D]=size(pic); if D==3 pic=rgb2gray(pic); end %% mask=[0 0 1 1 1 0 0;... 0 1 0 0 0 1 0;... 1 0 0 0 0 0 1;... 1 0 0 0 0 0 1;... 1 0 0 0 0 0 1;... 0 1 0 0 0 1 0;... 0 0 1 1 1 0 0]; mask=uint8(mask); threshold=50; figure;imshow(img);title('FAST角点检测' );hold on; tic; for i=4:M-3 for j=4:N-3%若I1、I9与中心I0的差均小于阈值,则不是候选点 delta1=abs(pic(i-3,j)-pic(i,j))>threshold; delta9=abs(pic(i+3,j)-pic(i,j))>threshold; delta5=abs(pic(i,j+3)-pic(i,j))>threshold; delta13=abs(pic(i,j-3)-pic(i,j))>threshold; if sum([delta1 delta9 delta5 delta13])>=3 block=pic(i-3:i+3,j-3:j+3); block=block.*mask;%提取圆周16个点 pos=find(block); block1=abs(block(pos)-pic(i,j))/threshold; block2=floor(block1); res=find(block2); if size(res,1)>=12 plot(j,i,'ro' ); end end end end toc; %% 输出结果: 参考文献 1、
Machine learning for high-speed corner detection[J],2006. 2、Features From Accelerated Segment Test[J],2010. 3、基于自适应阈值的FAST特征点提取算法[J],2013
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮