1. 程式人生 > >SURF特徵檢測

SURF特徵檢測

SIFT使用LOG的簡化演算法DOG以提升檢測效率,SURF(speeded up robust features)則是對DOH進行簡化。

雖然SIFT被認為是最有效和最常用的特徵提取演算法,但因為計算較為複雜,很難達到實時的速度;SURF將DOH的高斯二階微分模板進行了近似簡化,引入了積分影象的概念,將卷積運算簡化為幾個簡單的加減運算,實驗表明SURF較SIFT要快3倍左右。

1. 理論

與SIFT類似,SURF也需要建立尺度空間金字塔:將空間分為若干(預設5)個Octave,每個Octave包含若干層(預設4),每層的影象是用不同尺度的濾波模板計算得到的(SIFT在這裡首先做高斯卷積,然後用相鄰層相減來模擬LOG;SURF試圖模擬的是DOH),但相鄰Octave的圖片不再是降取樣的關係(節省了降取樣的計算),而是通過一組增大的取樣步長值計算得到(因為下一組Octave的模板半徑增大,因此相應增加模板移動步長也是合理的);

與SIFT最大不同是,濾波時不再採用卷積的方式:

(1)首先回顧下DOH用到的Hessian矩陣:對於影象每個點 f(x,y),有,一般做偏導前先做不同尺度的高斯模糊;我們都知道,卷積操作是計算量很大的,SURF對x,y的二階偏導和xy的二階偏導做了近似處理(圖1-1):


圖1-1. y方向二階導的近似(左),xy方向的二階導近似(右)

如圖1-1所示,令1所在區域為S1,2所在區域為S2,-1所在區域為S0,這樣各方向的二階導可近似處理為

為了避免重複計算,這裡引入積分影象的概念,很簡單,積分影象上每一點的值為以(0,0)為左上角,該點為右下角組成的矩形區域內所有點的和(圖1-2)


圖1-2. 積分影象(來源http://blog.csdn.net/xiaowei_cqu/article/details/17928733)

這樣,複雜的卷積運算就簡化為了加減運算。

根據DOH,最終的響應值是Hessian矩陣的行列式,有:


一般初始模板尺寸為9*9,對應的高斯sita=1.2,這樣可以得到Y=0.9,為了方便,將Y定為常值(理論上不同尺寸的模板對應不同的Y),同樣,將C也近似為常值,因為C不影響行列式極值的分佈,這樣行列式可近似為,其中Dxx,Dyy和Dxy按照上文的積分影象得到(最後除以積分割槽域面積以歸一化)。

(2)SURF空間尺度金字塔的每一層均由(1)計算得到。按照5個Octave,每個Octave為4層的結構,模板尺寸從9*9開始,相應的,二階微分濾波器的響應長度L=9/3=3(3個點計算兩個方向的微分值),這樣,其對應的積分模板為


圖1-3. 濾波尺度為9的積分模板(左為yy,右為xy)

據此可以得到積分模板尺寸f與濾波模板尺寸w的關係:對y方向(x方向為其轉置)f.height = w, f.width = 2/3*w-1;對xy方向 f.height = 2/3*w, f.width = f.height。

由於響應長度取值為3,5,7,9...(每次增加上下兩個畫素才能計算微分),可反推出濾波模板尺寸取值為9,15,21,27...,圖1-4為通常設定


圖1-4. 濾波尺寸

第n個Octave為第n-1個Octave模板尺寸序列隔一個抽取得到,重複抽取是為了保證連續性。相應的,其高寬是上一個Octave的一半,步長是上一個的2倍

(3)在尺度空間金字塔中通過比較相鄰26個位置得到區域性極值,通過插值對響應點的x,y,o位置進行亞畫素調整。這一步與SIFT完全一樣

(4)對每個候選極值點計算其梯度方向。SIFT使用直方圖的方式統計鄰域方向,最終形成128維的特徵向量;SURF在這裡使用Haar小波計算其方向(主要是為了方便用積分影象)


圖1-5. Haar小波模板(左X方向,右Y方向)

對每個待選點,(應用高斯分佈對每個點賦權重)計算其6倍尺度範圍內點的Haar在X和Y方向的響應值(Haar的尺寸為4倍尺度),選取最大的響應角為主方向

(5)構造特徵描述向量。對每個待選點,選取其以20倍尺度為邊長的鄰域,按照(3)得到的主方向進行旋轉(旋轉不變性),然後將該區域分為4*4=16個子區域,每個子區域內統計每個點的Haar在X和Y方向的響應強度之和以及響應強度絕對值之和(一共4個值),這樣每個待選點的特徵向量長度為16*4=64

(6)與SIFT一樣,SURF也有匹配的內容,OpenSurf在這裡用原始的窮舉法實現,比較慢,推薦用SIFT一文的BBF

2. 程式碼

OpenSURF是一個C++實現的版本,地址:http://opensurf1.googlecode.com/files/OpenSURFcpp.zip,需要翻牆

SHOW一個執行的效果:


3.參考

[1] http://www.cnblogs.com/tornadomeet/archive/2012/08/17/2644903.html

[2] http://blog.csdn.net/z8774316/article/details/7945310(程式碼分析)

[3] http://blog.csdn.net/a784763307/article/details/17289251