一、算法描述
尺度不變特徵轉換(Scale-invariant feature transform,SIFT),是一種圖像特徵提取與描述算法。SIFT是由David Lowe在1999年所發表,2004年進行了完善與總結。SIFT算法可以處理兩幅圖像之間發生平移、旋轉、尺度變換、光照變化等情況下的特徵匹配問題,並能在一定程度上對視角變化、仿射變化也具有穩定的特徵匹配能力。其應用範圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。
SIFT算法的特點有:
1. SIFT特徵是圖像的局部特徵,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;
2. 獨特性(Distinctiveness)好,信息量豐富,適用於在海量特徵數據庫中進行快速、準確的匹配;
3. 多量性,即使少數的幾個物體也可以產生大量的SIFT特徵向量;
4. 高速性,經優化的SIFT匹配算法甚至可以達到實時的要求;
5. 可擴展性,可以很方便的與其他形式的特徵向量進行聯合。
二、基本原理與實現步驟
一幅圖像的SIFT特徵向量的生成主要包括5步:尺度空間的生成、尺度空間極值檢測、精確確定極值點、關鍵點方向確定、特徵向量生成。
(1)DOG尺度空間生成
我們將圖像的尺度空間表示成一個函數L(x,y,sigma),它是由一個變尺度的高斯函數G(x,y,sigma)與圖像I(x,y)卷積產生的,即
G(x,y,sigma)則爲
(x,y)是空間座標,是尺度座標。σ大小決定圖像的平滑程度,大尺度對應圖像的概貌特徵,小尺度對應圖像的細節特徵。大的σ值對應粗糙尺度(低分辨率),反之,對應精細尺度(高分辨率)。 SIFT算法建議,在某一個尺度上對斑點的檢測,可以通過對兩個相鄰高斯尺度空間的圖像相減,得到一個DOG(Diffrence of Gaussians)的響應值圖像D(x,y,sigma)。然後仿照LOG方法,通過對響應值圖像D(x,y,sigma)進行非最大值抑制(局部極大搜索),在位置空間和尺度空間中定位斑點,其中
圖像金字塔的建立:對於一幅圖像I,建立其在不同尺度(scale)的圖像,也成爲子八度(octave),這是爲了scale-invariant,也就是在任何尺度都能夠有對應的特徵點,第一個子八度的scale爲原圖大小,後面每個octave爲上一個octave降採樣的結果,即原圖的1/4(長寬分別減半),構成下一個子八度(高一層金字塔)。
使用DOG對LOG近似帶來的好處包括:1LOG需要使用兩個方向的高斯二階微分卷積核,而DOG直接使用高斯卷積核,省去了對卷積核的生成的運算量;2DOG保留了各個高斯尺度空間的圖像,這樣在生成某一空間尺度的特徵時,可以直接使用L(x,y,sigma)函數產生的尺度空間圖像,而無需再次生成該尺度的圖像;3LOG對斑點進行檢測較DOH(Determinant of Hessian),Harris和其他店檢測方法穩定性更好,抗噪能力更強,而DOG是對LOG的近似和簡化,因此,也具備這種能力。
(2)檢測極值點
關鍵點是由DOG空間的局部極值點組成的,關鍵點的初步探查是通過同一組內各DoG相鄰兩層圖像之間比較完成的。爲了尋找DoG函數的極值點,每一個像素點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。如圖3.4所示,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。
(3)精確確定極值點
離散空間的極值點並不是真正的極值點,圖4.1顯示了二維函數離散空間得到的極值點與連續空間極值點的差別。利用已知的離散空間點插值得到的連續空間極值點的方法叫做子像素插值(Sub-pixel Interpolation)。
對於三元子像元插值,x(x,y,sigma)爲三維矢量,當x^ (相對於插值中心點的偏移量)在任何方向上的偏移量大於0.5時,意味着插值中心點已經偏移到它的鄰近點上,所以這樣的點需要剔除,另外當|D(x^)|<0.03時(假設圖像的灰度值在0~1.0之間),其響應值過小,這樣的點易受到噪聲的干擾而變得不穩定,所以也要被剔除。
爲了得到穩定的特徵點,只是剔除DOG響應值過低的點是不夠的,由於DOG對圖像中的邊緣有比較強的響應值,而一旦特徵點落在邊緣上,這些點就是不穩定的點。一方面圖像邊緣上點是很難定位的,具有定位的歧義性;另一方面這樣的點很容易受到噪聲的干擾而變得不穩定。
一個定義不好的高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。
DOG算子會產生較強的邊緣響應,需要剔除不穩定的邊緣響應點。獲取特徵點處的Hessian矩陣,主曲率通過一個2x2 的Hessian矩陣H求出:
D值可以通過求取近鄰點像元的差分得到。H的特徵值與D的主曲率成正比例。
表示矩陣H對角線元素之和,表示矩陣H的行列式。假設是α較大的特徵值,而是β較小的特徵值,令α=γ*β,這樣
上述的結果只是與兩個特徵值得比例有關,而與具體特徵值無關。當這兩個特徵值相等時,(γ+1)^2/γ的值最小,隨着γ的增加,(γ+1)^2/γ的值也增加。所以要想檢查主曲率的比值小於某一閾值γ,只要檢查下列式是否成立:
Lowe在論文中給出γ=10,也就是說,對於主曲率比值大於10的特徵點將被刪除,否則,這些斑點將被保留。
(4)關鍵點參數方向確定
爲了實現圖像旋轉的不變性,需要根據檢測到的特徵點的局部圖像結構求得一個方向基準。我們使用圖像梯度的方法求取該局部結構的穩定方向。使用有限差分,計算以特徵點爲中心,以3*1.5sigma爲半徑的區域內圖像梯度的幅角和副值,幅角和福值計算公式如下
在完成關鍵點的梯度計算後,使用直方圖統計鄰域內素的梯度和方向。梯度直方圖將0~360度的方向範圍分爲36個柱(bins),其中每柱10度。如圖5.1所示,直方圖的峯值方向代表了關鍵點的主方向,(爲簡化,圖中只畫了八個方向的直方圖)。
通過高斯加權,使特徵點附近的梯度幅值有較大的權重,這樣可以部分彌補因沒有仿射不變性而產生的特徵點不穩定的問題。在梯度方向直方圖中,方向直方圖的峯值則代表了該特徵點處鄰域梯度的方向,以直方圖中最大值作爲該關鍵點的主方向。爲了增強匹配的魯棒性,只保留峯值大於主方向峯值80%的方向作爲該關鍵點的輔方向。因此,對於同一梯度值的多個峯值的關鍵點位置,在相同位置和尺度將會有多個關鍵點被創建但方向不同。僅有15%的關鍵點被賦予多個方向,但可以明顯的提高關鍵點匹配的穩定性。實際編程實現中,就是把該關鍵點複製成多份關鍵點,並將方向值分別賦給這些複製後的關鍵點,並且,離散的梯度方向直方圖要進行插值擬合處理,來求得更精確的方向角度值。
(5)特徵點特徵矢量生成
通過以上步驟,對於每一個關鍵點,擁有三個信息:位置、尺度以及方向。接下來就是爲每個關鍵點建立一個描述符,用一組向量將這個關鍵點描述出來,使其不隨各種變化而改變,比如光照變化、視角變化等等。這個描述子不但包括關鍵點,也包含關鍵點周圍對其有貢獻的像素點,並且描述符應該有較高的獨特性,以便於提高特徵點正確匹配的概率。
代碼:
(1)Lowe的,http://download.csdn.net/detail/xc1499715227/8214649
(2)MATLAB版的,http://download.csdn.net/detail/xc1499715227/8255151