SIFT算法學習

SIFT算法學習

(本文的部分內容摘自一些網友的博客)  

Sift是David Lowe於1999年提出的局部特徵描述子,並於2004年進行了更深入的發展和完善。Sift特徵匹配算法可以處理兩幅圖像之間發生平移、旋轉、仿射變換情況下的匹配問題,具有很強的匹配能力。在Mikolajczyk對包括Sift算子在內的十種局部描述子所做的不變性對比實驗中,Sift及其擴展算法已被證實在同類描述子中具有最強的健壯性。

   

 總體來說,Sift算子具有以下特性:

   (1)Sift特徵是圖像的局部特徵,對平移、旋轉、尺度縮放、亮度變化、遮擋和噪聲等具有良好的不變性,對視覺變化、仿射變換也保持一定程度的穩定性。

   (2)獨特性好,信息量豐富,適用於在海量特徵數據庫中進行快速、準確的匹配。

   (3)多量性,即使少數的幾個物體也可以產生大量Sift特徵向量。

   (4)速度相對較快,經優化的Sift匹配算法甚至可以達到實時的要求。

   (5)可擴展性強,可以很方便的與其他形式的特徵向量進行聯合。

 -----------------------------------------------------------------------------------------------------------------------------------------------------------

Sift特徵匹配算法主要包括兩個階段:第一個階段是Sift特徵的生成;第二階段是Sift特徵向量的匹配。

     Sift特徵的生成一般包括以下幾個步驟:

 

Scale space extrema detection

 

圖像尺度空間的概念:

The scale space of an image is defined as a function,L(x,y,σ)that is produced from the convolution of a variable-scale GaussianG(x,y,σ) with the input image I(x,y)

          L(x,y,σ) = G(x,y,σ)×I(x,y)   

尺度空間可以理解爲圖像高斯金字塔

高斯金字塔的構造是這樣的,每組裏有若干層!第一組的第一層爲原圖像,然後將圖像做一次高斯平滑(高斯卷積、高斯模糊)高斯平滑裏有一個參數σ,在SIFT裏作者取1.6,然後將σ乘一個比例係數k作爲新的平滑因子來平滑第一組第二層得到第三層。重複若干次,得到L層他們分別對應的平滑參數爲:0,σ,kσ,k2σ....。然後將最後一幅圖像做比例因子爲2的降採樣得到第二組的第一層然後對第二組的第一層做參數是σ的高斯平滑,對第二層做kσ的平滑得到第三層.....這裏一定注意:每組對應的平滑因子是一樣的!這樣反覆形成了O組L層。一般模糊的高斯模板長寬都約爲6σ(這裏σ爲當次的平滑因子,就是可能是kσ,k2σ..)。

DoG(Difference of Gaussian)金字塔

由高斯金字塔構造出來,他的第一組第一層是由高斯金字塔的第一組第二層減第一組第一層,他的第一組第二層是由高斯金字塔的第一組第三層減第一組第二層得到,(說的這麼繁瑣是爲了大家能理解的直觀點)。每組都這樣就生成了DoG金字塔。順便說一下,DoG金字塔每組圖像幾乎都是一片黑,但仔細看你能看出輪廓的。

(兩個金字塔在SIFT算法裏的特殊說明:

  1、在SIFT裏高斯金字塔的第一組第一層通常是由一個原圖像長寬擴大一倍開始的,這樣做是爲了可以得到更多的特徵點
  2、大家可以發現如果用每組5層的高斯金字塔構造一個DoG金字塔的的話,DoG的每組的層數是4。
  3、對於DoG金字塔,特徵點的搜索從每組的二層到倒數第二層的(後面說明爲什麼),所以如果實際用n層那麼DoG金字塔應該有n+2層,那麼對應的高斯金字塔  應該有n+3層。
  4、由於這樣所以高斯金字塔從第二組開始的每組第一層是由上一組的倒數第二層降採樣得到的。


 
DoG的局部極值點:

關鍵點是由DOG空間的局部極值點組成的。爲了尋找DoG函數的極值點,每一個像素點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。中間的檢測點和它同尺度的 8 個相鄰點和上下相鄰尺度對應的 9×2 個點共 8+18=26 個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。

在極值比較的過程中,每一組圖像的首末兩層是無法進行極值比較的,爲了滿足尺度變化的連續性,我們在每一組圖像的頂層繼續用高斯模糊生成了3幅圖像,高斯金字塔有每組S+3層圖像。DOG金字塔每組有S+2層圖像。

 

Keypoint location

 

關鍵點精確定位:由於DoG值對噪聲和邊緣較敏感,因此,在上面DoG尺度空間中檢測到局部極值點還要經過進一步的檢驗才能精確定位爲特徵點。爲了提高關鍵點的穩定性,需要對尺度空間DoG函數進行曲線擬合,利用DoG函數在尺度空間的Taylor展開式獲取極值點的偏移量:

假設極值點的座標爲X=(x,y,l),此時這三個方向上的座標都爲整數。根據泰勒公式可以計算出以極值點爲原點相對於極值點在行、列以及層數上的偏移量

X_P=(x_p,y_p,intvl_p)。

定位準則:

1)如果三個方向上的偏移量都小於0.5,則認爲該點就是極值點。此時可以結束對這個極值點的分析,保存該點的偏移信息,然後分析該極值點的像素值是否滿足要求。

2)如果某一方向上的偏移量大於等於0.5,如假設x_p>=0.5,則採取下述方式進行處理:先將x_p四捨五入得到一個整數intx,然後將intx與x相加得到一個新的極值點 X_N=(x+intx,y,l), 如果點X_N沒有進入預先排除的區域則對這個點進行泰勒展開(否則該點被放棄,然後分析下一個極值點),直到找到一個點的偏移滿足在三個方向上都小於0.5爲止,然後記下點X_N及其偏移值,此時極值點爲X_N。但是這個重新確定極值點並重新定位的操作只能循環5次。若超過5次仍無法滿足1)的要求,這該極值點被放棄,然後分析下一個點。

 確定精確定位後的極值點的像素值,進行對比度的檢測。若像素值滿足大於contr_thr / intvls(程序中爲0.04/3),則該點才能最終確定爲極值點。

消除邊界響應:

要想移除邊界特徵,我們要計算特徵點附近高斯模糊圖像的梯度。基於特徵點附近的圖像,有三種可能的特徵:

1. 平坦特徵:該特徵在兩個方向的梯度值都很小。

2. 邊界特徵:該特徵一個方向的梯度值很大(垂直於邊界的方向),另一個方向的梯度值很小(沿着邊界的方向)。

3. 直角特徵:該特徵兩個方向的梯度值都很大。

直角特徵是很好的特徵點,我們想得到直角特徵,如果特徵點的兩個方向的梯度值都很大,那麼就讓它通過,否則就拒絕它。這可以通過Hessian矩陣實現,使用這個矩陣我們可以很容易地檢測它是不是直角特徵。在SIFT算法中,不需要像Harris corner檢測直接計算Hessian矩陣的兩個特徵值,而只需要計算兩個特徵值的積與和的比率。

 

關鍵點的尺度

 2i-1(σ,kσ,k2σ,...,kS-1σ)

k=21/S  S是每組的層數

i  金字塔組數

n  每一組的層數

 

Orientation Assignment

 

分配特徵點的方向:

在上個步驟,我們得到了合理的特徵點,並且這些特徵點被測試是在位置上穩定的,容易識別匹配的。由於我們已經知道特徵點是在哪個尺度被檢測到的,所以這些特徵點也是尺度不變的。接下來要對每個特徵點賦一個方向,以使這些特徵點具有旋轉不變性。特徵點所擁有的不變性越多越好。

在特徵點附近,我們創建一個方向收集區域來控制該特徵點影響的範圍,方向收集區域的大小依賴於它所在圖像的尺度,尺度越大,收集的區域越大。在方向收集區域中每個像素點的梯度大小和方向用下面的公式計算,從而得到另外兩幅圖,分別是梯度的大小圖和方向圖。

我們用一個直方圖來統計方向收集區域中像素的平均方向,在該直方圖中,將360度的方向分成36個bins,每個bin包含10度。假設方向收集區域中某個像素點的梯度方向是18.75度,把它放入10-19度的bin中,並且加入到bin中的量與該像素點的梯度大小成正比。

一旦對方向收集區域中的每個像素點都執行了這個操作後,直方圖在某個bin上出現最高峯值。並且所有大於最高峯80%的峯值也被轉化爲一個新的特徵點,這個新的特徵點和原來的特徵點一樣擁有相同的位置和尺度,但是新特徵點的方向是另一個峯值。因此方向將一個特徵點分爲多個特徵點。

 

方向收集區域的窗口大小等於1.5倍圖像尺度量的高斯窗口的大小。

 

Keypoint descriptor

 

現在我們已經得到了擁有尺度不變性和旋轉不變性的特徵點,接下來要爲每個特徵點創建一個唯一標識它的“指紋”,SIFT算法作者將它稱爲SIFT描述子(descriptor)。所生成的SIFT描述子既要能讓相同場景中圖像的特徵點能夠正確匹配,而且還要讓不同場景中圖像的特徵點能夠正確區分。

爲了得到這樣的SIFT描述子,我們將特徵點周圍16*16的窗口分解爲16個4*4的子窗口,下圖顯示了分解的過程。在每個4*4的子窗口中,計算出梯度的大小和方向,並用一個8個bin的直方圖來統計子窗口的平均方向,如圖2.13所示。

下圖將特徵點周圍16*16的窗口分解爲16個4*4的子窗口

梯度方向在0-44度範圍的像素點被放到第一個bin中,45-89度範圍的像素點被放到下一個bin中,依此類推。同樣加入到bin中的量依賴於該像素點梯度的大小。與之前不同的是,加入的量不僅與像素點的梯度大小相關,而且還依賴離特徵點的距離,這樣遠離特徵點的像素點會加入較少的量到直方圖中。這通過一個高斯加權函數來實現,這個函數生成一個加權值(像一個二維的鐘形曲線),用它乘以16*16的窗口中每個像素點的梯度大小,得到加權後的梯度大小,距離特徵點越遠,要加入直方圖的像素點的梯度大小越小。

這樣每個4*4的子窗口都對應一個8bin的直方圖,且直方圖中加入的值是像素的用高斯加權後的梯度大小,而特徵點周圍16*16的窗口中包含16個4*4的子窗口,共有16*8=128個數,然後將這128個數組成的向量進行單位化,單位化後的128維向量就是SIFT的描述子。

 

 

————————————————————————————————————————————————————————————

 關於SIFT匹配,後面兩篇文章講K-D tree的,講的不錯,可以過去看看。

http://underthehood.blog.51cto.com/2531780/687160

http://grunt1223.iteye.com/blog/921371

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