一 原始方法
簡介
在局部特征點檢測快速發展的時候,人們對於特征的認識也越來越深入,近幾年來許多學者提出了許許多多的特征檢測算法及其改進算法,在眾多的特征提取算法中,不乏涌現出佼佼者。
從最早期的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特征檢測的過程,清晰明了,而對於角點的定義也是做到了返璞歸真,大師就是大師,還原本質的能力很強,估計以前這種簡單想法被很多人忽略了。
1 # -*-coding:utf-8-*- 2 3 4 import cv2 5 import datetime 6 7 img1 = cv2.imread('/home/260158/code/pictures-data/CMU0/medium00.JPG') 8 9 starttime = datetime.datetime.now() 10 11 fast = cv2.FastFeatureDetector_create(90) 12 kp = fast.detect(img1,None) 13 img2 = cv2.drawKeypoints(img1,kp,(0,0,255)) 14 15 endtime = datetime.datetime.now() 16 a = endtime- starttime 17 18 19 #cv2.namedWindow('fast', cv2.WINDOW_NORMAL) 20 21 cv2.imshow('fast',img2) 22 cv2.waitKey(0) 23 print a
結果