matlab學習:SIFT特征提取


1.推薦/引用 博客

SIFT算法研究:http://underthehood.blog.51cto.com/2531780/658350

SIFT特征提取算法總結:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html

圖像特征提取與匹配之SIFT算法:http://blog.csdn.net/v_JULY_v/article/details/6186942

一些公式推導來自實驗室師兄的筆記,感謝。

論文:David G. Lowe, "Distinctive image features from scale-invariant keypoints,"
    International Journal of Computer Vision, 60, 2 (2004), pp. 91-110

                              SIFT算法學習

1.算法流程

 

2.具體實現

(1)構造高斯差分尺度空間

高斯函數是唯一的尺度變換核,則圖像的尺度空間就可以看做是尺度變換的高斯函數與輸入圖像的卷積。

其中,尺度可變的高斯核為

其中,(x,y)是空間坐標,σ是尺度坐標。σ 的大小決定圖像的平滑程度,大尺度對應圖像的概貌特征(低分辨率),小尺度對應圖像的細節特征(高分辨率)。

為了有效在尺度空間檢測到穩定的關鍵點,提出用不同尺度的高斯差分核與圖像卷積:

其中k為常數,用來區分兩相鄰尺度乘積因子。

選擇高斯差分尺度空間DOG的原因:

① 容易計算,為求出不同尺度上的圖像特征,只需要作差就可以了;

② 高斯差分函數DOG近似於尺度歸一化的LOG,相比於其他特征,LOG的最大最小值產生的特征更加穩定。

關於DOG近似歸一化LOG的證明:

利用有限差分逼近:

在所有尺度上,k-1是常數,不影響極值點的位置,k越接近1,近似誤差越接近0.但實際中發現這種近似對極值檢測的穩定性和位置幾乎不存在影響,甚至在尺度上發生較大變化時也一樣。

高斯差分尺度空間的構造:

首先是構建圖像的高斯金字塔。原始圖像遞增地與高斯函數卷積來生成新尺寸的圖像,尺度空間中的圖像由常數因子K來區別。

關於尺度空間的理解說明:上圖是必須的,尺度空間是連續的。在Lowe的論文中 ,在最開始建立高斯金字塔時,要預先模糊輸入圖像來作為第0個組的第0層的圖像,這樣就會丟失高頻信息。因此,為了充分利用輸入圖像可以首先對原始圖像長寬擴展一倍,來增加特征點數量。尺度越大圖像越模糊。 我們利用線性插值將圖像擴大為原來2倍,作為金字塔的第一層。

圖像金字塔共分O組,一組稱為一個Octave,每組又分為多層,層間隔數為S,因此有S+3(S+1+22代表在上下再各添一層圖像,搜索極值只在中間的S+1層圖像上搜索)層圖像,下一組的第一層圖像由上一組的倒數第三層(如果層索引從0開始,則為第S層)圖像按照隔點采樣(試驗中用3個尺度采樣)得到,可減少卷積運算的工作量。

DoG是通過高斯金字塔中的每組上下相鄰兩層的高斯尺度空間圖像相減得到。

 

(2)尋找尺度空間極值點

 

  同一組中的相鄰尺度(由於k的取值關系,肯定是上下層)之間進行尋找:在極值比較的過程中,每一組圖像的首末兩層是無法進行極值比較的,為了滿足尺度變化的連續性,在每一組圖像的頂層繼續用高斯模糊生成了 幅圖像,高斯金字塔有每組S+3層圖像。DOG金字塔每組有S+2層圖像.

 

           

(3)精確定位極值點

 

① 對檢測到的極值點進行三維二次函數擬合,精確定位極值點的位置和尺度,達到亞像素精度。

極值點的搜索是在離散空間中進行的,檢測到的極值點並不是真正意義上的極值點。二維函數離散空間得到的極值點與連續空間極值點有差別。利用已知的離散空間點插值得到的連續空間極值點的方法叫做子像素插值.

插值的方法是根據泰勒級數展開:

求導,並令其為0,得到極值點位置的偏移量:

x^代表相對於插值中心的偏移量,當它在任一維度上的偏移量大於0.5時(即xy或σ),意味着插值中心已經偏移到它的鄰近點上,所以必須改變當前關鍵點的位置(加上x^)同時在新的位置上反復插值直到收斂;也有可能超出所設定的迭代次數或者超出圖像邊界的范圍,此時這樣的點應該刪除。

 

② 去除低對比度的點

極值點的函數值:

回代:

得:

極值點的函數值可以用來去除由低對比度造成的不穩定極值,在該文章中,若極值點函數值小於0.03,則表明其響應值過小易受噪聲影響而變得不穩定,要去除.

③ 去除邊緣相應

高斯差分函數DOG對邊緣有着很強的響應,邊緣上的點對於小的噪聲不穩定。根據Harris角點可以知道,一個角點在任何方向上平移都應該保證局部窗口內的像素值的劇烈變化,而邊緣上的點沿着邊緣方向移動時局部窗口內的像素值基本沒有什么變化。

一個平坦的(邊緣點)DoG響應峰值往往在橫跨邊緣的地方有較大的主曲率,而在垂直的方向有較小的主曲率。所以利用主曲率比的大小來排除邊緣響應的點。而主曲率可以通過2×2Hessain矩陣H求出:

H的特征值與D的主曲率成正比例。我們只關心比例,可以不必明確地計算特征值,可以由H的跡和行列式的積來計算特征值的和。令α為大的特征值,β為小的特征值,則主曲率的比值大小可由特征值所表示的比值式來計算:

試驗中,該比例大於10的點被認為是邊緣點,應去除。

 

(4)給每個關鍵點分配主方向

 

利用關鍵點鄰域像素的梯度方向分布特性(幅值和方向)為每個關鍵點指定方向參數,使算子具備旋轉不變性。

其中L所用的尺度為每個關鍵點各自所在的尺度。

在完成特征點鄰域的高斯圖像的梯度計算后,使用直方圖統計鄰域內像素的梯度方向和幅值。梯度方向直方圖的橫軸是梯度方向角,縱軸是梯度方向角對應的梯度幅值累加。梯度方向直方圖將0-360度的范圍分為36個柱(bins),每10度一個柱。

高斯加權函數(o為描述子窗寬的一半)用來對每個采樣點的幅值進行加權,距離描述子中心越遠的領域對直方圖的貢獻也響應也越小,可以避免窗口位置變化引起的描述子突變。

直方圖的峰值代表該特征點處鄰域內圖像梯度的主方向,也即該特征點的主方向。

當存在一個相當於主峰值能量80%能量的峰值時,會產生一個具有該主方向的極值點。因此,對於具有相似幅值的多峰位置點,會在一個位置上產生多個關鍵點。只有15%的點會有多個方向,但是這對匹配影響很大。最終,用拋物線來擬合3個接近峰值的直方圖的值進行峰值點位置插值,獲得更好的准確性。

(5)特征描述子生成

 

每一個小格都代表了特征點鄰域所在的尺度空間的一個像素 ,箭頭方向代表了像素梯度方向,箭頭長度代表該像素的幅值。然后在4×4的窗口內計算8個方向的梯度方向直方圖。繪制每個梯度方向的累加可形成一個種子點。

每個直方圖有8方向的梯度方向,每一個描述符包含一個位於關鍵點附近的四個直方圖數組.這就導致了SIFT的特征向量有128.(先是一個4×4的來計算出一個直方圖,每個直方圖有8個方向。所以是4×4×8=128維)

為避免邊界影響,采用三線性插值,將每一個梯度樣本值分配到相鄰的直方圖塊中。每一個直方圖塊在每個維上乘以權重1-dd是樣本到直方圖塊中心值的距離。

&實現光照不變性

① 處理線性變化(對比度/亮度):歸一化到單位向量

為了降低光照變化的影響:首先,特征向量歸一化到單位長度,每個像素值乘以一個常數引起圖像對比度的改變,會使梯度乘以相同的常數。所以歸一化后會撤銷常數的改變。亮度變化引起的每個像素值增加一個常數,不會影響梯度值。因此該描述子具有光照不變性。

② 處理非線性變化(飽和度/光照):歸一化+閾值化+歸一化

相機飽和度或光照變化影響3D表面的方向變化,這些影響會使梯度幅值有大的改變,但不太會影響梯度方向。因此要降低大的梯度幅值的影響,將單位特征向量進行閾值化:對於中值大於0.2的要進行截斷,即大於0.2的值只取0.2,再進行一次歸一化處理,其目的是提高特征的鑒別性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM