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

SIFT特徵檢測

Lowe提出的SIFT(Scale Invariant Feature Transform)是計算機視覺裡影響力非常大的一個演算法,其使用LOG的近似演算法DOG(Difference of Gaussians)實現快速特徵檢測,然後對待選點進行位置的精調和篩選,最後考察其鄰域,獲得特徵的向量性描述。

SIFT特徵效率高(優化後能達到實時的效果),具有尺度不變性旋轉不變性部分的仿射不變性

1. 理論

總的來說,SIFT主要分為以下4個步驟[1]:

(1)尺度空間極值檢測:搜尋所有尺度上的影象位置。通過高斯微分函式(近似)來識別潛在的對於尺度和旋轉不變的興趣點。

(2)關鍵點的定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據於它們的穩定程度。

(3)方向的確定:基於影象區域性的梯度方向,分配給每個關鍵點位置一個或多個方向。所有後面的對影象資料的操作都相對於關鍵點的方向、尺度和位置進行變換,從而提供對於這些變換的不變性。

(4)關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量影象區域性的梯度。這些梯度被變換成一種表示,這種表示允許比較大的區域性形狀的變形和光照變化。

尺度空間極值檢測

出發點與LOG一樣,為了使特徵具有尺度不變性。

SIFT首先建立影象金字塔:將金字塔分成O組,每一組稱為一個Octave;每一個Octave又分成S層,每層的影象是由不同方差的高斯濾波器濾波的結果(越往上影象越模糊);每一個Octave的底層影象由上一個Octave的第S層影象高寬下2取樣得到(縮小1/4);然後對高斯塔相鄰兩層做差得到DOG響應金字塔(是對LOG的近似)


圖1-1. 影象金字塔

如圖1-1,由圖片大小決定Octave的數目(Rob Hess程式碼預設當圖片縮小到4個畫素則停止),每Octave的層數設為3-5層(程式碼預設3);對於第 i 個(i=1...)Octave的第 n 層(n=1...S)圖片,其對應的高斯尺度為,其中,sita一般預設為1.6。在實際中,為了保證上一組Octave與當前Octave的連續性,需要對每Octave的頂層再加3層,也就是實際上每一Octave的層數為S+3(假設S=3,對第1個Octave,gauss塔尺度為σ, kσ, k2σ, DoG塔尺度為σ, kσ,而DOG空間中的極值比較需要3層,因此考慮加上3層,這樣第1個Octave的DOG空間尺度為 σ, k

σ, k2σ, k3σ,k4σ,第2個Octave的DOG空間尺度為 2σ, 2kσ, 2k2σ, 2k3σ, 2k4σ,進行極值比較時底層和頂層無法計算,由於2 * k3σ = 2kσ 實現了尺度變化的連續性

SIFT尺度空間的極值檢測在DOG塔裡進行,對每個點,比較其相鄰的26個點,若為最大或最小值則記為待選極值點

通常需要將原始影象做高斯平滑(σ = 0.5),考慮到因此損失的高頻資訊,第1Octave的第1層為原始影象resize 2倍再平滑的結果,這樣建立高斯塔的高斯尺度為

關鍵點的定位

(1)對於DOG金字塔的每個點,(Rob Hess程式碼裡先經過一次對比度閾值篩選)檢測其鄰近26個點,如果為極值則記為待選點;

(2)以上極值點是在離散空間中搜索的,SIFT對每個待選點,通過插值得到極值點再連續空間中的精確位置(包括 行,列,尺度):

,f(x)為該向量在DOG空間中的響應,將其泰勒展開,有,其中,對f(X)求導,取其導數為0時候的點,即為所求精確位置距當前位置的偏移向量:。當計算得到的偏移向量每一維都小於0.5時認為位置調整完畢。

(3)根據(2)更新的極值點位置及偏移向量,計算對應的DOG響應(理論上f(X)的極值),如果該響應小於給定閾值(0.03),認為其不夠穩定,刪除。

(4)過濾可能的邊緣點。SIFT認為邊緣點不好定位,並且易受噪聲影響,因此需要去除。注意到邊緣點在橫跨邊緣的地方有較大麴率,而在垂直邊緣的方向有較小曲率。曲率通過DOG響應的Hessian矩陣求得(見DOH分析):,其兩個特徵值反映了x,y兩個方向的長度,當兩個特徵值相等時特徵區域為圓形,此時公式取最小值,其中。Lowe論文中取r=10,大於該式的特徵將被去掉。

方向的確定及關鍵點描述

對每個特徵點,需要根據公式計算其方向及該方向的強度。注意L表示在高斯空間的影象金字塔內計算。

為了獲得穩定的方向,SIFT考慮當前點鄰域內點的方向及強度,乘以高斯分佈引數(近似圓形),並將方向離散化為45度(或10度)一柱,用8柱(36柱)的直方圖描述鄰域內所有點的方向,以此作為該特徵點的方向描述(對8柱直方圖,如果鄰域半徑為4,則該特徵的方向特徵維度為4*4*8=128),最後將方向特徵向量歸一化以排除光照影響,取最大的那個分量作為該關鍵點的主方向。

在這裡一般還會對方向描述直方圖做高斯平滑以彌補仿射帶來的影響;還可以選取第二大的分量作為關鍵點的輔助方向。

在最後生成的關鍵點描述向量(128維)時,還需以其主方向為參考,旋轉其它方向,以此來確保SIFT特徵的旋轉不變性

2. 關於SIFT特徵匹配

SIFT特徵必有的內容就是匹配不同視角下同一特徵,基本思想很簡單,分別對兩幅圖做SIFT檢測,一一計算特徵向量的歐式距離。

但窮舉法效率太低,Rob Hess程式碼中應用了KD樹(K近鄰的一種實現)組織特徵向量,使用BBF演算法進行查詢,匹配效率達到實時的效果。

3. 程式碼

需要說明的是,Rob程式碼裡預設直方圖是36柱,這樣特徵維數應該是4*4*36 = 576,但其巨集定義裡設定的維度為128,會造成洩露,改下定義就好了

貼兩張Rob Hess程式碼得到的效果圖(上為SIFT檢測效果,下為match效果):


4. 參考

[1] http://underthehood.blog.51cto.com/2531780/658350

[2] http://blog.csdn.net/abcjennifer/article/details/7639681

[3] http://blog.sina.com.cn/s/blog_4bdb170b0101pumc.html

[4] http://blog.csdn.net/v_july_v/article/details/6246213