尺度不变特征转换(Scale-invariant feature transform 或 SIFT)
SIFT是用來偵測與描述影像中的局部性特征,它在空間尺度中尋找極值點,并提取出其位置、尺度、旋轉不變量;
SIFT檢測局部特征的算法,該算法通過求一幅圖中的特征點(interest points,or corner points)及其有關scale 和 orientation 的描述子得到特征并進行圖像特征點匹配
算法介紹:
一:圖像空間尺度的生成
L(x,y,σ), σ= 1.6 a good tradeoff
不同σ下圖像尺度空間:
關于尺度空間的理解說明:2kσ中的2是必須的,尺度空間是連續的。在 ?Lowe的論文中 ,將第0層的初始尺度定為1.6(最模糊),圖片的初始尺度定為0.5(最清晰). 在檢測極值點前對原始圖像的高斯平滑以致圖像丟失高頻信息,所以 Lowe 建議在建立尺度空間前首先對原始圖像長寬擴展一倍,以保留原始圖像信息,增加特征點數量。尺度越大圖像越模糊。?
圖像金字塔:
尺度空間的所有取值,i為octave的塔數(第幾個塔),s為每塔層數
對于一幅圖像I,建立其在不同尺度(scale)的圖像,也成為子八度(octave),這是為了scale-invariant,也就是在任何尺度都能夠有對應的特征點,第一個子八度的scale為原圖大小,后面每個octave為上一個octave降采樣的結果,即原圖的1/4(長寬分別減半),構成下一個子八度(高一層金字塔)。由圖片size決定建幾個塔,每塔幾層圖像(S一般為3-5層)。0塔的第0層是原始圖像(或你double后的圖像),往上每一層是對其下一層進行Laplacian變換(高斯卷積,其中σ值漸大,例如可以是σ, k*σ, k*k*σ…),直觀上看來越往上圖片越模糊。塔間的圖片是降采樣關系,例如1塔的第0層可以由0塔的第3層down sample得到,然后進行與0塔類似的高斯卷積操作。
二:檢測空間極值點
為了尋找尺度空間的極值點,每一個采樣點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。如圖所示,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。 一個點如果在DOG尺度空間本層以及上下兩層的26個領域中是最大或最小值時,就認為該點是圖像在該尺度下的一個特征點,如圖所示。
在極值比較的過程中,每一組圖像的首末兩層是無法進行極值比較的,為了滿足尺度變化的連續性(下面有詳解),我們在每一組圖像的頂層繼續用高斯模糊生成了?3 幅圖像,高斯金字塔有每組S+3層圖像。DOG金字塔每組有S+2層圖像.
==========================================
這里有的童鞋不理解什么叫“為了滿足尺度變化的連續性”,現在做仔細闡述:設s=3,也就是每個塔里有3層,則k=21/s=21/3,那么按照上圖可得Gauss Space和DoG space 分別有3個(s個)和2個(s-1個)分量,在DoG space中,1st-octave兩項分別是σ,kσ; 2nd-octave兩項分別是2σ,2kσ;由于無法比較極值,我們必須在高斯空間繼續添加高斯模糊項,使得形成σ,kσ,k2σ,k3σ,k4σ這樣就可以選擇DoG space中的中間三項kσ,k2σ,k3σ(只有左右都有才能有極值),那么下一octave中(由上一層降采樣獲得)所得三項即為2kσ,2k2σ,2k3σ,其首項2kσ=24/3。剛好與上一octave末項k3σ=23/3尺度變化連續起來,所以每次要在Gaussian space添加3項,每組(塔)共S+3層圖像,相應的DoG金字塔有S+2層圖像。
三:去除不好的點(精確定位極值點)
通過擬和三維二次函數以精確確定關鍵點的位置和尺度(達到亞像素精度),同時去除低對比度的關鍵點和不穩定的邊緣響應點(因為DoG算子會產生較強的邊緣響應),以增強匹配穩定性、提高抗噪聲能力,在這里使用近似Harris Corner檢測器。
①空間尺度函數泰勒展開式如下:
對上式求導,并令其為0,得到精確的位置, 得
②在已經檢測到的特征點中,要去掉低對比度的特征點和不穩定的邊緣響應點。去除低對比度的點:把公式(2)代入公式(1),即在DoG Space的極值點處D(x)取值,只取前兩項可得:
若該特征點就保留下來,否則丟棄。
③邊緣響應的去除
一個定義不好的高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。主曲率通過一個2×2 的Hessian矩陣H求出:
導數由采樣點相鄰差估計得到。D的主曲率和H的特征值成正比,令α為較大特征值,β為較小的特征值,則
令α=γβ,則
(r + 1)2/r的值在兩個特征值相等的時候最小,隨著r的增大而增大,因此,為了檢測主曲率是否在某域值r下,只需檢測
if?(α+β)/?αβ> (r+1)2/r, throw it out. ??在Lowe的文章中,取r=10。
四:給特征點賦值一個128維方向參數
上一步中確定了每幅圖中的特征點,為每個特征點計算一個方向,依照這個方向做進一步的計算,?利用關鍵點鄰域像素的梯度方向分布特性為每個關鍵點指定方向參數,使算子具備旋轉不變性。
為(x,y)處梯度的模值和方向公式。其中L所用的尺度為每個關鍵點各自所在的尺度。至此,圖像的關鍵點已經檢測完畢,每個關鍵點有三個信息:位置,所處尺度、方向,由此可以確定一個SIFT特征區域。
梯度直方圖的范圍是0~360度,其中每10度一個柱,總共36個柱。隨著距中心點越遠的領域其對直方圖的貢獻也響應減小.Lowe論文中還提到要使用高斯函數對直方圖進行平滑,減少突變的影響。在實際計算時,我們在以關鍵點為中心的鄰域窗口內采樣,并用直方圖統計鄰域像素的梯度方向。梯度直方圖的范圍是0~360度,其中每45度一個柱,總共8個柱, 或者每10度一個柱,總共36個柱。
直方圖中的峰值就是主方向,其他的達到最大值80%的方向可作為輔助方向
由梯度方向直方圖確定主梯度方向
該步中將建立所有scale中特征點的描述子(128維)
關鍵點描述子的生成步驟
通過對關鍵點周圍圖像區域分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域圖像信息的一種抽象,具有唯一性。
五: 關鍵點描述子的生成
首先將坐標軸旋轉為關鍵點的方向,以確保旋轉不變性。以關鍵點為中心取8×8的窗口。
Figure.16*16的圖中其中1/4的特征點梯度方向及scale,右圖為其加權到8個主方向后的效果。
圖左部分的中央為當前關鍵點的位置,每個小格代表關鍵點鄰域所在尺度空間的一個像素,利用公式求得每個像素的梯度幅值與梯度方向,箭頭方向代表該像素的梯度方向,箭頭長度代表梯度模值,然后用高斯窗口對其進行加權運算。
圖中藍色的圈代表高斯加權的范圍(越靠近關鍵點的像素梯度方向信息貢獻越大)。然后在每4×4的小塊上計算8個方向的梯度方向直方圖,繪制每個梯度方向的累加值,即可形成一個種子點,如圖右部分示。此圖中一個關鍵點由2×2共4個種子點組成,每個種子點有8個方向向量信息。這種鄰域方向性信息聯合的思想增強了算法抗噪聲的能力,同時對于含有定位誤差的特征匹配也提供了較好的容錯性。
計算keypoint周圍的16*16的window中每一個像素的梯度,而且使用高斯下降函數降低遠離中心的權重。
在每個4*4的1/16象限中,通過加權梯度值加到直方圖8個方向區間中的一個,計算出一個梯度方向直方圖。
這樣就可以對每個feature形成一個4*4*8=128維的描述子,每一維都可以表示4*4個格子中一個的scale/orientation.?將這個向量歸一化之后,就進一步去除了光照的影響。
六:根據SIFT進行Match
實際計算過程中,為了增強匹配的穩健性,Lowe建議對每個關鍵點使用4×4共16個種子點來描述,這樣對于一個關鍵點就可以產生128個數據,即最終形成128維的SIFT特征向量。此時SIFT特征向量已經去除了尺度變化、旋轉等幾何變形因素的影響,再繼續將特征向量的長度歸一化,則可以進一步去除光照變化的影響。?當兩幅圖像的SIFT特征向量生成后,下一步我們采用關鍵點特征向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取圖像1中的某個關鍵點,并找出其與圖像2中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離少于某個比例閾值,則接受這一對匹配點。降低這個比例閾值,SIFT匹配點數目會減少,但更加穩定。為了排除因為圖像遮擋和背景混亂而產生的無匹配關系的關鍵點,Lowe提出了比較最近鄰距離與次近鄰距離的方法,距離比率ratio小于某個閾值的認為是正確匹配。因為對于錯誤匹配,由于特征空間的高維性,相似的距離可能有大量其他的錯誤匹配,從而它的ratio值比較高。Lowe推薦ratio的閾值為0.8。但對大量任意存在尺度、旋轉和亮度變化的兩幅圖片進行匹配,結果表明ratio取值在0. 4~0. 6之間最佳,小于0. 4的很少有匹配點,大于0. 6的則存在大量錯誤匹配點。(如果這個地方你要改進,最好給出一個匹配率和ration之間的關系圖,這樣才有說服力)
建議ratio的取值原則如下:
ratio=0. 4 對于準確度要求高的匹配; ratio=0. 6 對于匹配點數目要求比較多的匹配;? ratio=0. 5 一般情況下。 也可按如下原則: 當最近鄰距離<200時ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分錯誤匹配點。 七:尺度不變特征變換(SIFT算法)Matlab程序代碼
目前網絡上可以找到的關于SIFT算法Matlab測試代碼的資源就是:
1 加拿大University of British Columbia 大學計算機科學系教授 David G. Lowe發表于2004年Int Journal of Computer Vision,2(60):91-110的那篇標題為“Distivtive Image Features from Scale -Invariant Keypoints" 的論文。作者在其學術網站上發表的Matlab程序代碼(注意,這個程序代碼的初始版本是 D. Alvaro and J.J. Guerrero, 來自Universidad de Zaragoza。)上述代碼可以很容易檢索到,如,http://www.cs.ubc.ca/~lowe/keypoints/
2 美國加州大學洛杉磯分校(University of California at Los Angeles) Andrea Vedaldi 博士研究生給出的基于David Lowe 發表的論文給利用Matlab和C語言混合編程給出的Sift detector and descriptor的實現過程。http://vision.ucla.edu/~vedaldi/
3?
match.m:測試程序
功能:該函數讀入兩幅(灰度)圖像,找出各自的 SIFT 特征, 并顯示兩連接兩幅圖像中被匹配的特征點(關鍵特征點(the matched keypoints)直線(將對應特征點進行連接)。判斷匹配的準則是匹配距離小于distRatio倍于下一個最近匹配的距離( A match is accepted only if its distance is less than distRatio times the distance to the second closest match.
該程序返回顯示的匹配對的數量。( It returns the number of matches displayed.)
調用實例: match('desk.jpg','book.jpg');
( 假如,想測試一個含有一本書的桌面的圖像 和一本書的圖像之間特征匹配)
注意:(1)圖像為灰度圖像,如果是彩色圖像,應該在調用前利用rgb2gray轉換為灰度圖像。
? ? ? ? ?(2)參數distRatio 為控制匹配點數量的系數,這里取 0.6,該參數決定了匹配點的數量,在Match.m文件中調整該參數,獲得最合適的匹配點數量。
sift.m :尺度不變特征變換(SIFT算法)的核心算法程序
具體原理詳見David G. Lowe發表于2004年Int Journal of Computer Vision,2(60):91-110的那篇標題為“Distivtive Image Features from Scale -Invariant Keypoints" 的論文
功能:該函數讀入灰度圖像,返回SIFT 特征關鍵點( SIFT keypoints.)
調用方法和參數描述:
調用方式:[image, descriptors, locs] = sift(imageFile)
輸入參數( Input parameters):
imageFile: 圖像文件名.
輸出或返回參數( Returned):
image: 是具有double format格式的圖像矩陣
descriptors: 一個 K-by-128 的矩陣x, 其中每行是針對找到的K個關鍵特征點(the K keypoints) 的不變量描述子. 這個描述子(descriptor)是一個擁有128個數值并歸一化為單位長度向量.
locs: 是K-by-4 矩陣, 其中的每一行具有四個數值,表示關鍵點位置信息 (在圖像中的行坐標,列坐標(row, column) ,注意,一般圖像的左上角為坐標原點), 尺度scale,高斯尺度空間的參數,其中該參數也決定了frame(結構)確定的圖像disk的大小, 最后一個參數是方向orientation). 方向參數的范圍是[-PI, PI] 單位為弧度.
appendimages.m:??? 該函數創建一個新的圖像分別包含兩個匹配的圖像和他們之間的匹配對的連接直線.
總結
以上是生活随笔為你收集整理的尺度不变特征转换(Scale-invariant feature transform 或 SIFT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: psql中character varyi
- 下一篇: html 磁贴自动布局,也来“玩”Met