雙目立體視覺-特徵提取之SURF算法

SURF

轉自:https://blog.csdn.net/qq_30815237/article/details/86545950

源文章有代碼

SURF(Speeded Up Robust Features)是對SIFT的一種改進,主要特點是快速。SURF與SIFT主要有以下幾點不同處理:

      1、 SIFT在構造DOG金字塔以及求DOG局部空間極值比較耗時,SURF的改進是使用Hessian矩陣變換圖像,極值的檢測只需計算Hessian矩陣行列式,作爲進一步優化,使用一個簡單的方程可以求出Hessian行列式近似值,使用盒狀模糊濾波(box blur)求高斯模糊近似值。

      2、 SURF不使用降採樣,通過保持圖像大小不變,但改變盒狀濾波器的大小來構建尺度金字塔。

       3、在計算關鍵點主方向以及關鍵點周邊像素方向的方法上,SURF不使用直方圖統計,而是使用哈爾(haar)小波轉換。SIFT的KPD達到128維,導致KPD的比較耗時,SURF使用哈爾(haar)小波轉換得到的方向,讓SURF的KPD降到64維,減少了一半,提高了匹配速度

           如果說SIFT算法中使用DOG對LOG進行了簡化,提高了搜索特徵點的速度,那麼SURF算法則是對DoH的簡化與近似。雖然SIFT算法已經被認爲是最有效的,也是最常用的特徵點提取的算法,但如果不借助於硬件的加速和專用圖像處理器的配合,SIFT算法以現有的計算機仍然很難達到實時的程度。對於需要實時運算的場合,如基於特徵點匹配的實時目標跟蹤系統,每秒要處理8-24幀的圖像,需要在毫秒級內完成特徵點的搜索、特徵矢量生成、特徵矢量匹配、目標鎖定等工作,這樣SIFT算法就很難適應這種需求了。SURF借鑑了SIFT中簡化近似的思想,把DoH中的高斯二階微分模板進行了簡化,使得模板對圖像的濾波只需要進行幾個簡單的加減法運算,並且,這種運算與濾波器的尺度無關。實驗證明,SURF算法較SIFT在運算速度上要快3倍左右。

1. 積分圖像

SURF算法中要用到積分圖像的概念。藉助積分圖像,圖像與高斯二階微分模板的濾波轉化爲對積分圖像的加減運算。

積分圖像中任意一點(i,j)的值ii(i,j),爲原圖像左上角到點(i,j)相應的對角線區域灰度值的總和,即

                                     ii(i,j)=\sum_{r\leqslant i,c \leqslant j}^{ } p(r,c)

式中,p(r,c)表示圖像中點(r,c)的灰度值,ii(i,j)可以用下面兩式迭代計算得到

                                      

式中,S(i,j)表示一列的積分,且S(i,−1)=0 ,ii(-1,j)=0。求積分圖像,只需要對原圖像所有像素進行一遍掃描。

OpenCV中提供了用於計算積分圖像的接口


 
  1. *src :輸入圖像,大小爲M*N

  2. * sum: 輸出的積分圖像,大小爲(M+1)*(N+1)

  3. * sdepth:用於指定sum的類型,-1表示與src類型一致

  4. */

  5. void integral(InputArray src, OutputArray sum, int sdepth = -1);

   值得注意的是OpenCV裏的積分圖大小比原圖像多一行一列,那是因爲OpenCV中積分圖的計算公式爲:
                                     ii(i,j)=\sum_{r< i,c <j}^{ } p(r,c)
  一旦積分圖計算好了,計算圖像內任何矩形區域的像素值的和只需要三個加法,如下圖所示:
                       

2. DoH近似

     surf構造的金字塔圖像與sift有很大不同,Sift採用的是DOG圖像,而surf採用的是Hessian矩陣行列式近似值圖像。 

    Hessian矩陣是Surf算法的核心,構建Hessian矩陣的目的是爲了生成圖像穩定的邊緣點(突變點),爲下文的特徵提取做好基礎。每一個像素點都可以求出一個Hessian矩陣:

                                 

    當Hessian矩陣的判別式取得局部極大值時,判定當前點是比周圍鄰域內其他點更亮或更暗的點,由此來定位關鍵點的位置,Hessian矩陣的判別式爲:

                                     

     在SURF算法中,圖像像素l(x,y)即爲函數值f(x,y)。但是由於我們的特徵點需要具備尺度無關性,所以在進行Hessian矩陣構造前,需要對其進行高斯濾波,選用二階標準高斯函數作爲濾波器 。通過特定核間的卷積計算二階偏導數,這樣便能計算出H矩陣的三個矩陣元素L_xx, L_xy, L_yy從而計算出H矩陣,在點x處,尺度爲σ的Hessian矩陣H(x,σ)定義如下:

                                               

式中,L_{xx}(x,\sigma )是高斯二階微分 在在像素點(x,y)處與圖像函數I(x,y)的卷積。

下面顯示的是上面三種高斯微分算子的圖形。

                              

       但是利用Hessian行列式進行圖像斑點檢測時,有一個缺點。由於二階高斯微分被離散化和裁剪的原因,導致了圖像在旋轉奇數倍的\pi /4時,即轉換到模板的對角線方向時,特徵點檢測的重複性降低(也就是說,原來特徵點的地方,可能檢測不到特徵點了)。而在\pi /2時,特徵點檢測的重現率真最高。但這一小小的不足不影響我們使用Hessian矩陣進行特徵點的檢測。

盒式濾波器

    由於高斯核是服從正態分佈的,從中心點往外,係數越來越低,爲了提高運算速度,Surf使用了盒式濾波器來近似替代高斯濾波器,提高運算速度。 盒式濾波器(Boxfilter)對圖像的濾波轉化成計算圖像上不同區域間像素和的加減運算問題,只需要簡單幾次查找積分圖就可以完成。每個像素的Hessian矩陣行列式的近似值: ,在Dxy上乘了一個加權係數0.9,目的是爲了平衡因使用盒式濾波器近似所帶來的誤差。

    高斯函數的高階微分與離散的圖像函數I(x,y)做卷積運算時相當於使用高斯濾波模板對圖像做濾波處理。

    在實際運用中,高斯二階微分進行離散化和裁剪處理得到盒子濾波器近似代替高斯濾波板進行卷積計算,我們需要對高斯二階微分模板進行簡化,使得簡化後的模板只是由幾個矩形區域組成,矩形區域內填充同一值,如下圖所示,在簡化模板中白色區域的值爲正數,黑色區域的值爲負數,灰度區域的值爲0。

   

      對於σ=1.2的高斯二階微分濾波器,我們設定模板的尺寸爲9×9的大小,並用它作爲最小尺度空間值對圖像進行濾波和斑點檢測。我們使用Dxx、Dxy和Dyy表示模板與圖像進行卷積的結果。這樣,便可以將Hessian矩陣的行列式作如下的簡化:

                      

    濾波器響應的相關權重w是爲了平衡Hessian行列式的表示式。這是爲了保持高斯核與近似高斯核的一致性。

                                              

   其中|X|_{F}爲Frobenius範數。理論上來說對於不同的σ的值和對應尺寸的模板尺寸,w值是不同的,但爲了簡化起見,可以認爲它是同一個常數。

        使用近似的Hessian矩陣行列式來表示圖像中某一點x處的斑點響應值,遍歷圖像中所有的像元點,便形成了在某一尺度下關鍵點檢測的響應圖像。使用不同的模板尺寸,便形成了多尺度斑點響應的金字塔圖像,利用這一金字塔圖像,就可以進行斑點響應極值點的搜索,其過程完全與SIFT算法類同。

3. 尺度空間表示

     通常想要獲取不同尺度的斑點,必須建立圖像的尺度空間金字塔。一般的方法是通過不同σ的高斯函數,對圖像進行平滑濾波,然後重採樣圖像以獲得更高一層的金字塔圖像。SIFT特徵檢測算法中就是通過相鄰兩層圖像金字塔相減得到DoG圖像,然後再在DoG圖像上進行斑點和邊緣檢測工作的。

     由於採用了盒子濾波和積分圖像,所以,我們並不需要像SIFT算法那樣去直接建立圖像金字塔,而是採用不斷增大盒子濾波模板的尺寸的間接方法。通過不同尺寸盒子濾波模板與積分圖像求取Hessian矩陣行列式的響應圖像。然後在響應圖像上採用3D非最大值抑制,求取各種不同尺度的斑點。

     如前所述,我們使用9×9的模板對圖像進行濾波,其結果作爲最初始的尺度空間層(此時,尺度值爲s=1.2,近似σ=1.2的高斯微分),後續的層將通過逐步放大濾波模板尺寸,以及放大後的模板不斷與圖像進行濾波得到。由於採用盒子濾波和積分圖像,濾波過程並不隨着濾波模板尺寸的增加而使運算工作量增加。

     與SIFT算法類似,我們需要將尺度空間劃分爲若干組(Octaves)。一個組代表了逐步放大的濾波模板對同一輸入圖像進行濾波的一系列響應圖。每個組又由若干固定的層組成。由於積分圖像離散化的原因,兩個層之間的最小尺度變化量是由高斯二階微分濾波器在微分方向上對正負斑點響應長度l_{0}決定的,它是盒子濾波器模板尺寸的1/3。對於9×9的模板,它的l_{0}=3。下一層的響應長度至少應該在l_{0}的基礎上增加2個像素,以保證一邊一個像素,即l_{0}=5。這樣模板的尺寸就爲15×15。以此類推,我們可以得到一個尺寸增大模板序列,它們的尺寸分別爲:9×9,15×15,21×21,27×279×9,15×15,21×21,27×27,黑色、白色區域的長度增加偶數個像素,以保證一箇中心像素的存在。

                                     

     採用類似的方法來處理其他幾組的模板序列。其方法是將濾波器尺寸增加量翻倍(6,12,24,38)。這樣,可以得到第二組的濾波器尺寸,它們分別爲15,27,39,51。第三組的濾波器尺寸爲27,51,75,99。如果原始圖像的尺寸仍然大於對應的濾波器尺寸,尺度空間的分析還可以進行第四組,其對應的模板尺寸分別爲51,99,147和195。下圖顯示了第一組至第三組的濾波器尺寸變化。

                                           

    在通常尺度分析情況下,隨着尺度的增大,被檢測到的斑點數量迅速衰減。所以一般進行3-4組就可以了,與此同時,爲了減少運算量,提高計算的速度,可以考慮在濾波時,將採樣間隔設爲2。

    對於尺寸爲L的模板,當用它與積分圖運算來近似二維高斯核的濾波時,對應的二維高斯核的參數σ=1.2×(L/9),這一點至關重要,尤其是在後面計算描述子時,用於計算鄰域的半徑時。

Hessian行列式圖像的產生過程

     在SURF算法的尺度空間中,每一組中任意一層包括D_{xx},D_{yy},D_{xy}三種盒子濾波器。對一幅輸入圖像進行濾波後通過Hessian行列式計算公式可以得到對於尺度座標下的Hessian行列式的值,所有Hessian行列式值構成一幅Hessian行列式圖像。

4. 興趣點的定位

     爲了在圖像及不同尺寸中定位興趣點,我們用了3×3×3鄰域非最大值抑制。具體的步驟基本與SIFT一致,而且Hessian矩陣行列式的最大值在尺度和圖像空間被插值。

      總體來說,如果理解了SIFT算法,再來看SURF算法會發現思路非常簡單。尤其是局部最大值查找方面,基本一致。關鍵還是一個用積分圖來簡化卷積的思路,以及怎麼用不同的模板來近似原來尺度空間中的高斯濾波器。

5. SURF特徵點方向分配

       爲了保證特徵矢量具有旋轉不變性,與SIFT特徵一樣,需要對每個特徵點分配一個主方向。爲些,我們需要以特徵點爲中心,以6*s(s=1.2∗L/9爲特徵點的尺度)爲半徑的圓形區域,對圖像進行Haar小波響應運算。這樣做實際就是對圖像進行梯度運算只不過是我們需要利用積分圖像,提高計算圖像梯度的效率。在SIFT特徵描述子中我們在求取特徵點主方向時,以是特徵點爲中心,在以4.5σ爲半徑的鄰域內計算梯度方向直方圖。事實上,兩種方法在求取特徵點主方向時,考慮到Haar小波的模板帶寬,實際計算梯度的圖像區域是相同的。用於計算梯度的Harr小波的尺度爲4s。

                                          

     其中左側模板計算X方向的響應,右側模板計算y方向的響應,黑色表示-1,白色表示+1。用其對圓形領域進行處理後,就得到了該領域內每個點對應的x,y方向的響應,然後用以興趣點爲中心的高斯函數(\sigma =2s)對這些響應進行加權。

     爲了求取主方向值,需要設計一個以特徵點爲中心,張角爲60度的扇形滑動窗口,統計這個扇形區域內的haar小波特徵總和。以步長爲0.2弧度左右,旋轉這個滑動窗口,再統計小波特徵總和。小波特徵總和最大的方向爲主方向。特徵總和的求法是對圖像Harr小波響應值dx、dy進行累加,得到一個矢量(m_{w},\theta _{w})

                                            

主方向爲最大Harr響應累加值所對應的方向,也就是最長矢量所對應的方向,即

                                                

      可以依照SIFT求方向時策略,當存在另一個相當於主峯值80%能量的峯值時,則將這個方向認爲是該特徵點的輔方向。一個特徵點可能會被指定具有多個方向(一個主方向,一個以上輔方向),這可以增強匹配的魯棒性。和SIFT的描述子類似,如果在m_{w}中出現另一個大於主峯能量max[m_{w}]的80%時的次峯,可以將該特徵點複製成兩個特徵點。一個主的方向爲最大響應能量所對應的方向,另一個主方向爲次大響應能量所對應的方向。

                

5.1  特徵點特徵矢量生成

    在SIFT中關鍵點描述是選取了關鍵點周圍16*16的領域,又將其劃分爲4*4的區域,每個區域統計8個方向梯度,最後得到4*4*8=128維度的描述向量。

    SURF中,我們在關鍵點周圍選取一個正方形框,方向爲關鍵點的主方向,邊長爲20S。將其劃分爲16個區域(邊長爲5S),每個區域統計25個像素的水平方向和垂直方向的Haar小波特性(均相對於正方形框的主方向確定的)

      生成特徵點描述子,需要計算圖像的Haar小波響應。在一個矩形區域來計算Haar小波響應。以特徵點爲中心,沿上一節討論得到的主方向,沿主方向將20s×20s的圖像劃分爲4×4個子塊,每個子塊利用尺寸2s的Harr模板進行響應值計算,然後對響應值進行統計∑dx、∑|dx|、∑dy、∑|dy|形成特徵矢量。如下圖2所示。圖中,以特徵點爲中心,以20s爲邊長的矩形窗口爲特徵描述子計算使用的窗口,特徵點到矩形邊框的線段表示特徵點的主方向。

                                           

      將20s的窗口劃分成4×4子窗口,每個子窗口有5s×5s個像素。使用尺寸爲2s的Harr小波對子窗口圖像進行其響應值計算,共進行25次採樣,分別得到沿主方向的dy和垂直於主方向的dx。然後,以特徵點爲中心,對dy和dx進行高斯加權計算,高斯核的參數爲σ=3.3s(即20s/6)。最後分別對每個子塊的響應值進行統計,得到每個子塊的矢量:

                                         

      由於共有4×4個子塊,因此,特徵描述子共由4×4×4=64維特徵矢量組成。SURF描述子不僅具有尺度和旋轉不變性,而且對光照的變化也具有不變性。使小波響應本身就具有亮度不變性,而對比度的不變性則是通過將特徵矢量進行歸一化來實現。圖3 給出了三種不同圖像模式的子塊得到的不同結果。對於實際圖像的描述子,我們可以認爲它們是由這三種不同模式圖像的描述子組合而成的。

                              

     爲了充分利用積分圖像進行Haar小波的響應計算,我們並不直接旋轉Haar小波模板求得其響應值,而是在積圖像上先使用水平和垂直的Haar模板求得響應值dy和dx,然後根據主方向旋轉dx和dy與主方向操持一致,如下圖4所示。爲了求得旋轉後Haar小波響應值,首先要得到旋轉前圖像的位置。旋轉前後圖偈的位置關係,可以通過點的旋轉公式得到:

                                             

    在得到點(j,i)在旋轉前對應積分圖像的位置(x,y)後,利用積分圖像與水平、垂直Harr小波,求得水平與垂直兩個方向的響應值dx和dy。對dx和dy進行高斯加權處理,並根據主方向的角度,對dx和dy進行旋轉變換,從而,得到旋轉後的dx’和dy’。其計算公式如下:

                                                     

                         

5.2 特徵描述子的維數

      一般而言,特徵矢量的長度越長,特徵矢量所承載的信息量就越大,特徵描述子的獨特性就越好,但匹配時所付出的時間代價就越大。對於SURF描述子,可以將它擴展到用128維矢量來表示。具體方法是在求∑dx、∑|dx|時區分dy<0和dy≥0情況。同時,在求取∑dy、∑|dy|時區分dx<0和dx≥0情況。這樣,每個子塊就產生了8個梯度統計值,從而使描述子特徵矢量的長度增加到8×4×4=128維。

       爲了實現快速匹配,SURF在特徵矢量中增加了一個新的變量,即特徵點的拉普拉斯響應正負號。在特徵點檢測時,將Hessian矩陣的跡的正負號記錄下來,作爲特徵矢量中的一個變量。這樣做並不增加運算量,因爲特徵點檢測進已經對Hessian矩陣的跡進行了計算。在特徵匹配時,這個變量可以有效地節省搜索的時間,因爲只有兩個具有相同正負號的特徵點纔有可能匹配,對於正負號不同的特徵點就不進行相似性計算。

       簡單地說,我們可以根據特徵點的響應值符號,將特徵點分成兩組,一組是具有拉普拉斯正響應的特徵點,一組是具有拉普拉斯負響應的特徵點,匹配時,只有符號相同組中的特徵點才能進行相互匹配。顯然,這樣可以節省特徵點匹配的時間。如下圖5所示。

                              

      實際上有文獻指出,SURF比SIFT工作更出色。他們認爲主要是因爲SURF在求取描述子特徵矢量時,是對一個子塊的梯度信息進行求和,而SIFT則是依靠單個像素梯度的方向。

SURF算法與SIFT算法總結對比

(1)在生成尺度空間方面,SIFT算法利用的是差分高斯金字塔與不同層級的空間圖像相互卷積生成。SURF算法採用的是不同尺度的box filters與原圖像卷積

(2)在特徵點檢驗時,SIFT算子是先對圖像進行非極大值抑制,再去除對比度較低的點。然後通過Hessian矩陣去除邊緣的點。

而SURF算法是先通過Hessian矩陣來檢測候選特徵點,然後再對非極大值的點進行抑制

(3)在特徵向量的方向確定上,SIFT算法是在正方形區域內統計梯度的幅值的直方圖,找到最大梯度幅值所對應的方向。SIFT算子確定的特徵點可以有一個或一個以上方向,其中包括一個主方向與多個輔方向。

SURF算法則是在圓形鄰域內,檢測各個扇形範圍內水平、垂直方向上的Haar小波響應,找到模值最大的扇形指向,且該算法的方向只有一個。

(4)SIFT算法生成描述子時,是將16*16的採樣點劃分爲4*4的區域,從而計算每個分區種子點的幅值並確定其方向,共計4*4*8=128維。

SURF算法在生成特徵描述子時將20s*20s的正方形分割成4*4的小方格,每個子區域25個採樣點,計算小波haar響應,一共4*4*4=64維。

綜上,SURF算法在各個步驟上都簡化了一些繁瑣的工作,僅僅計算了特徵點的一個主方向,生成的特徵描述子也與前者相比降低了維數。

from:https://www.cnblogs.com/gfgwxw/p/9415218.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章