標籤:
尺度不變特徵變換匹配演算法詳解
Scale Invariant Feature Transform(SIFT)
Just For Fun
zdd [email protected] or ([email protected])
對於初學者,從David G.Lowe的論文到實現,有許多鴻溝,本文幫你跨越。
如果你學習SIFI得目的是為了做檢索,也許OpenSSE更適合你,歡迎使用。
1、SIFT綜述
尺度不變特徵轉換(Scale-invariant feature transform或SIFT)是一種電腦視覺的演算法用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變數,此演算法由 David Lowe在1999年所發表,2004年完善總結。
其應用範圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。
此演算法有其專利,專利擁有者為英屬哥倫比亞大學。
局部影像特徵的描述與偵測可以協助辨識物體,SIFT 特徵是基於物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。對於光線、雜訊、些微視角改變的容忍度也相當高。基於這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特徵資料庫中,很容易辨識物體而且鮮有誤認。使用 SIFT特徵描述對於部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特徵就足以計算出位置與方位。在現今的電腦硬體速度下和小型的特徵資料庫條件下,辨識速度可接近即時運算。SIFT特徵的資訊量大,適合在海量資料庫中快速準確匹配。
SIFT演算法的特點有:
1. SIFT特徵是映像的局部特徵,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、雜訊也保持一定程度的穩定性;
2. 獨特性(Distinctiveness)好,資訊量豐富,適用於在海量特徵資料庫中進行快速、準確的匹配;
3. 多量性,即使少數的幾個物體也可以產生大量的SIFT特徵向量;
4. 高速性,經最佳化的SIFT匹配演算法甚至可以達到即時的要求;
5. 可擴充性,可以很方便的與其他形式的特徵向量進行聯合。
SIFT演算法可以解決的問題:
目標的自身狀態、情境所處的環境和成像器材的成像特性等因素影響映像配准/目標識別跟蹤的效能。而SIFT演算法在一定程度上可解決:
1. 目標的旋轉、縮放、平移(RST)
2. 映像仿射/投影變換(視點viewpoint)
3. 光照影響(illumination)
4. 目標遮擋(occlusion)
5. 雜物情境(clutter)
6. 雜訊
SIFT演算法的實質是在不同的尺度空間上尋找關鍵點(特徵點),並計算出關鍵點的方向。SIFT所尋找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。
Lowe將SIFT演算法分解為如下四步:
1. 尺度空間極值檢測:搜尋所有尺度上的映像位置。通過高斯微分函數來識別潛在的對於尺度和旋轉不變的興趣點。
2. 關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據於它們的穩定程度。
3. 方向確定:基於映像局部的梯度方向,分配給每個關鍵點位置一個或多個方向。所有後面的對映像資料的操作都相對於關鍵點的方向、尺度和位置進行變換,從而提供對於這些變換的不變性。
4. 關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量映像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。
本文沿著Lowe的步驟,參考Rob Hess及Andrea Vedaldi源碼,詳解SIFT演算法的實現過程。
2、高斯模糊
SIFT演算法是在不同的尺度空間上尋找關鍵點,而尺度空間的擷取需要使用高斯模糊來實現,Lindeberg等人已證明高斯卷積核是實現尺度變換的唯一變換核,並且是唯一的線性核。本節先介紹高斯模糊演算法。
2.1二維高斯函數
高斯模糊是一種映像濾波器,它使用常態分佈(高斯函數)計算模糊模板,並使用該模板與原映像做卷積運算,達到模糊映像的目的。
N維空間常態分佈方程為:
(1-1)
其中,是常態分佈的標準差,值越大,映像越模糊(平滑)。r為模糊半徑,模糊半徑是指模板元素到模板中心的距離。如二維模板大小為m*n,則模板上的元素(x,y)對應的高斯計算公式為:
(1-2)
在二維空間中,這個公式產生的曲面的等高線是從中心開始呈常態分佈的同心圓,2.1所示。分布不為零的像素組成的卷積矩陣與原始映像做變換。每個像素的值都是周圍相鄰像素值的加權平均。原始像素的值有最大的高斯分布值,所以有最大的權重,相鄰像素隨著距離原始像素越來越遠,其權重也越來越小。這樣進行模糊處理比其它的均衡模糊濾波器更高地保留了邊緣效果。
理論上來講,映像中每點的分布都不為零,這也就是說每個像素的計算都需要包含整幅映像。在實際應用中,在計算高斯函數的離散近似時,在大概3σ距離之外的像素都可以看作不起作用,這些像素的計算也就可以忽略。通常,影像處理程式只需要計算的矩陣就可以保證相關像素影響。
2.2 映像的二維高斯模糊
根據σ的值,計算出高斯模板矩陣的大小(),使用公式(1-2)計算高斯模板矩陣的值,與原映像做卷積,即可獲得原映像的平滑(高斯模糊)映像。為了確保模板矩陣中的元素在[0,1]之間,需將模板矩陣歸一化。5*5的高斯模板如表2.1所示。
是5*5的高斯模板卷積計算。高斯模板是中心對稱的。
2.3分離高斯模糊
2.3所示,使用二維的高斯模板達到了模糊映像的目的,但是會因模板矩陣的關係而造成邊緣映像缺失(2.3 b,c),越大,缺失像素越多,丟棄模板會造成黑邊(2.3 d)。更重要的是當變大時,高斯模板(高斯核)和卷積運算量將大幅度提高。根據高斯函數的可分離性,可對二維高斯模糊函數進行改進。
高斯函數的可分離性是指使用二維矩陣變換得到的效果也可以通過在水平方向進行一維高斯矩陣變換加上豎直方向的一維高斯矩陣變換得到。從計算的角度來看,這是一項有用的特性,因為這樣只需要次計算,而二維不可分的矩陣則需要次計算,其中,m,n為高斯矩陣的維數,M,N為二維映像的維數。
另外,兩次一維的高斯卷積將消除二維高斯矩陣所產生的邊緣。(關於消除邊緣的論述如2.4所示, 對用模板矩陣超出邊界的部分——虛線框,將不做卷積計算。2.4中x方向的第一個模板1*5,將退化成1*3的模板,只在映像之內的部分做卷積。)
附錄1是用opencv2.2實現的二維高斯模糊和分離高斯模糊。表2.2為上述兩種方法和opencv2.3開源庫實現的高斯模糊程式的比較。
3、尺度空間極值檢測
尺度空間使用高斯金字塔表示。Tony Lindeberg指出尺度正常化的LoG(Laplacion of Gaussian)運算元具有真正的尺度不變性,Lowe使用高斯差分金字塔近似LoG運算元,在尺度空間檢測穩定的關鍵點。
3.1 尺度空間理論
尺度空間(scale space)思想最早是由Iijima於1962年提出的,後經witkin和Koenderink等人的推廣逐漸得到關注,在電腦視覺鄰域使用廣泛。
尺度空間理論的基本思想是:在映像資訊處理模型中引入一個被視為尺度的參數,通過連續變化尺度參數獲得多尺度下的尺度空間表示序列,對這些序列進行尺度空間主輪廓的提取,並以該主輪廓作為一種特徵向量,實現邊緣、角點檢測和不同解析度上的特徵提取等。
尺度空間方法將傳統的單尺度映像資訊處理技術納入尺度不斷變化的動態分析架構中,更容易擷取映像的本質特徵。尺度空間中各尺度映像的模糊程度逐漸層大,能夠類比人在距離目標由近到遠時目標在視網膜上的形成過程。
尺度空間滿足視覺不變性。該不變性的視覺解釋如下:當我們用眼睛觀察物體時,一方面當物體所處背景的光照條件變化時,視網膜感知映像的亮度水平和對比是不同的,因此要求尺度空間運算元對映像的分析不受映像的灰階水平和對比變化的影響,即滿足灰階不變性和對比不變性。另一方面,相對於某一固定座標系,當觀察者和物體之間的相對位置變化時,視網膜所感知的映像的位置、大小、角度和形狀是不同的,因此要求尺度空間運算元對映像的分析和映像的位置、大小、角度以及仿射變換無關,即滿足平移不變性、尺度不變性、歐幾裡德不變性以及仿射不變性。
3.2 尺度空間的表示
一個映像的尺度空間,定義為一個變化尺度的高斯函數與原映像的卷積。
(3-1)
其中,*表示卷積運算,
(3-2)
與公式(1-2)相同,m,n表示高斯模板的維度(由確定)。(x, y)代表映像的像素位置。是尺度空間因子,值越小表示映像被平滑的越少,相應的尺度也就越小。大尺度對應於映像的概貌特徵,小尺度對應於映像的細節特徵。
3.3 高斯金字塔的構建尺度空間在實現時使用高斯金字塔表示,高斯金字塔的構建分為兩部分:1. 對映像做不同尺度的高斯模糊;
2. 對映像做降採樣(隔點採樣)。
映像的金字塔模型是指,將原始映像不斷降階採樣,得到一系列大小不一的映像,由大到小,從下到上構成的塔狀模型。原映像為金子塔的第一層,每次降採樣所得到的新映像為金字塔的一層(每層一張映像),每個金字塔共n層。金字塔的層數根據映像的原始大小和塔頂映像的大小共同決定,其計算公式如下:
(3-3)
其中M,N為原映像的大小,t為塔頂映像的最小維數的對數值。如,對於大小為512*512的映像,金字塔上各層映像的大小如表3.1所示,當塔頂映像為4*4時,n=7,當塔頂映像為2*2時,n=8。
為了讓尺度體現其連續性,高斯金字塔在簡單降採樣的基礎上加上了高斯濾波。3.1所示,將影像金字塔每層的一張映像使用不同參數做高斯模糊,使得金字塔的每層含有多張高斯模糊映像,將金字塔每層多張映像合稱為一組(Octave),金字塔每層只有一組映像,組數和金字塔層數相等,使用公式(3-3)計算,每組含有多張(也叫層Interval)映像。另外,降採樣時,高斯金字塔上一組映像的初始映像(底層映像)是由前一組映像的倒數第三張映像隔點採樣得到的。
註:由於組內的多張映像按層次疊放,因此組內的多張映像也稱做多層,為避免與金字塔層的概念混淆,本文以下內容中,若不特別說明是金字塔層數,層一般指組內各層映像。
註:如3.4節所示,為了在每組中檢測S個尺度的極值點,則DOG金字塔每組需S+2層映像,而DOG金字塔由高斯金字塔相鄰兩層相減得到,則高斯金字塔每組需S+3層映像,實際計算時S在3到5之間。取S=3時,假定高斯金字塔儲存索引如下:
第0組(即第-1組): 0 1 2 3 4 5
第1組: 6 7 8 9 10 11
第2組: ?
則第2組第一張圖片根據第一組中索引為9的圖片降採樣得到,其它類似。
3.4 高斯差分金字塔
2002年Mikolajczyk在詳細的實驗比較中發現尺度歸一化的高斯拉普拉斯函數的極大值和極小值同其它的特徵提取函數,例如:梯度,Hessian或Harris角特徵比較,能夠產生最穩定的映像特徵。
而Lindeberg早在1994年就發現高斯差分函數(Difference of Gaussian ,簡稱DOG運算元)與尺度歸一化的高斯拉普拉斯函數非常近似。其中和的關係可以從如下公式推導得到:
利用差分近似代替微分,則有:
因此有
其中k-1是個常數,並不影響極值點位置的求取。
3.2所示,紅色曲線表示的是高斯差分運算元,而藍色曲線表示的是高斯拉普拉斯運算元。Lowe使用更高效的高斯差分運算元代替拉普拉斯運算元進行極值檢測,如下:
(3-4)
在實際計算時,使用高斯金字塔每組中相鄰上下兩層映像相減,得到高斯差分映像,3.3所示,進行極值檢測。
3.5 空間極值點檢測(關鍵點的初步探查)
關鍵點是由DOG空間的局部極值點組成的,關鍵點的初步探查是通過同一組內各DoG相鄰兩層映像之間比較完成的。為了尋找DoG函數的極值點,每一個像素點要和它所有的相鄰點比較,看其是否比它的映像域和尺度域的相鄰點大或者小。3.4所示,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維映像空間都檢測到極值點。
由於要在相鄰尺度進行比較,3.3右側每組含4層的高斯差分金子塔,只能在中間兩層中進行兩個尺度的極值點檢測,其它尺度則只能在不同組中進行。為了在每組中檢測S個尺度的極值點,則DOG金字塔每組需S+2層映像,而DOG金字塔由高斯金字塔相鄰兩層相減得到,則高斯金字塔每組需S+3層映像,實際計算時S在3到5之間。
當然這樣產生的極值點並不全都是穩定的特徵點,因為某些極值點響應較弱,而且DOG運算元會產生較強的邊緣響應。
3.6 構建尺度空間需確定的參數
—尺度空間座標
O—組(octave)數
S— 組內層數
在上述尺度空間中,O和S,的關係如下:
(3-5)
其中是基準層尺度,o為組octave的索引,s為組內層的索引。關鍵點的尺度座標就是按關鍵點所在的組和組內的層,利用公式(3-5)計算而來。
在最開始建立高斯金字塔時,要預先模糊輸入映像來作為第0個組的第0層的映像,這時相當於丟棄了最高的空域的採樣率。因此通常的做法是先將映像的尺度擴大一倍來產生第-1組。我們假定初始的輸入映像為了抗擊混淆現象,已經對其進行的高斯模糊,如果輸入映像的尺寸用雙線性插值擴大一倍,那麼相當於。
取式(3-4)中的k為組內總層數的倒數,即
(3-6)
在構建高斯金字塔時,組內每層的尺度座標按如下公式計算:
(3-7)
其中初始尺度,lowe取,s為組內的層索引,不同組相同層的組內尺度座標相同。組內下一層映像是由前一層映像按進行高斯模糊所得。式(3-7)用於一次產生組內不同尺度的高斯映像,而在計算群組內某一層映像的尺度時,直接使用如下公式進行計算:
(3-8)
該組內尺度在方向分配和特徵描述時確定採樣視窗的大小。
由上,式(3-4)可記為
(3-9)
圖3.5為構建DOG金字塔的,原圖採用128*128的jobs映像,擴大一倍後構建金字塔。
4、關鍵點定位
以上方法檢測到的極值點是離散空間的極值點,以下通過擬合三維二次函數來精確確定關鍵點的位置和尺度,同時去除低對比的關鍵點和不穩定的邊緣響應點(因為DoG運算元會產生較強的邊緣響應),以增強匹配穩定性、提高抗雜訊能力。
4.1關鍵點的精確定位
離散空間的極值點並不是真正的極值點,圖4.1顯示了二維函數離散空間得到的極值點與連續空間極值點的差別。利用已知的離散空間點插值得到的連續空間極值點的方法叫做子像素插值(Sub-pixel Interpolation)。
為了提高關鍵點的穩定性,需要對尺度空間DoG函數進行曲線擬合。利用DoG函數在尺度空間的Taylor展開式(擬合函數)為:
(4-1)
其中,。求導並讓方程等於零,可以得到極值點的位移量為:
(4-2)
對應極值點,方程的值為:
(4-3)
其中,代表相對插值中心的位移量,當它在任一維度上的位移量大於0.5時(即x或y或),意味著插值中心已經位移到它的鄰近點上,所以必須改變當前關鍵點的位置。同時在新的位置上反覆插值直到收斂;也有可能超出所設定的迭代次數或者超出映像邊界的範圍,此時這樣的點應該刪除,在Lowe中進行了5次迭代。另外,過小的點易受雜訊的幹擾而變得不穩定,所以將小於某個經驗值(Lowe論文中使用0.03,Rob Hess等人實現時使用0.04/S)的極值點刪除。同時,在此過程中擷取特徵點的精確位置(原位置加上擬合的位移量)以及尺度()。
4.2消除邊緣響應
一個定義不好的高斯差分運算元的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。
DOG運算元會產生較強的邊緣響應,需要剔除不穩定的邊緣響應點。擷取特徵點處的Hessian矩陣,主曲率通過一個2x2 的Hessian矩陣H求出:
(4-4)
H的特徵值α和β代表x和y方向的梯度,
(4-5)
表示矩陣H對角線元素之和,表示矩陣H的行列式。假設是α較大的特徵值,而是β較小的特徵值,令,則
(4-6)
導數由採樣點相鄰差估計得到,在下一節中說明。
D的主曲率和H的特徵值成正比,令為α最大特徵值,β為最小的特徵值,則公式的值在兩個特徵值相等時最小,隨著的增大而增大。值越大,說明兩個特徵值的比值越大,即在某一個方向的梯度值越大,而在另一個方向的梯度值越小,而邊緣恰恰就是這種情況。所以為了剔除邊緣響應點,需要讓該比值小於一定的閾值,因此,為了檢測主曲率是否在某域值r下,只需檢測
(4-7)
式(4-7)成立時將關鍵點保留,反之剔除。
在Lowe的文章中,取r=10。圖4.2右側為消除邊緣響應後的關鍵點分布圖。
4.3有限差分法求導
有限差分法以變數離散取值後對應的函數值來近似微分方程中獨立變數的連續取值。在有限差分方法中,我們放棄了微分方程中獨立變數可以取連續值的特徵,而關注獨立變數離散取值後對應的函數值。但是從原則上說,這種方法仍然可以達到任意滿意的計算精度。因為方程的連續數值解可以通過減小獨立變數離散取值的間格,或者通過離散點上的函數值插值計算來近似得到。這種方法是隨著電腦的誕生和應用而發展起來的。其計算格式和程式的設計都比較直觀和簡單,因而,它在計算數學中使用廣泛。
有限差分法的具體操作分為兩個部分:
1. 用差分代替微分方程中的微分,將連續變化的變數離散化,從而得到差分方程組的數學形式;
2. 求解差分方程組。
一個函數在x點上的一階和二階微商,可以近似地用它所臨近的兩點上的函數值的差分來表示。如對一個單變數函數f(x),x為定義在區間[a,b]上的連續變數,以步長將區間[a,b]離散化,我們會得到一系列節點,
然後求出f(x)在這些點上的近似值。顯然步長h越小,近似解的精度就越好。與節點相鄰的節點有和,所以在節點處可構造如下形式的差值:
節點的一階向前差分
節點的一階向後差分
節點的一階中心差分
本文使用中心差分法利用泰勒展開式求解第四節所使用的導數,現做如下推導。
函數f(x)在處的泰勒展開式為:
(4-8)
則,
(4-9)
(4-10)
忽略h平方之後的項,聯立式(4-9),(4-10)解方程組得:
(4-11)
(4-12)
二元函數的泰勒展開式如下:
將展開後忽略次要項聯立解方程得二維混合偏導如下:
(4-13)
綜上,推導了4.1,4.2遇到的所有導數計算。同理,利用多元泰勒展開式,可得任意偏導的近似差分表示。
在影像處理中,取h=1,在圖4.2所示的映像中,將像素0的基本中點導數公式整理如下:
4.4 三階矩陣求逆公式
高階矩陣的求逆演算法主要有歸一法和消元法兩種,現將三階矩陣求逆公式總結如下:
若矩陣
可逆,即時,
(4-14)
5、關鍵點方向分配
為了使描述符具有旋轉不變性,需要利用映像的局部特徵為給每一個關鍵點分配一個基準方向。使用映像梯度的方法求取局部結構的穩定方向。對於在DOG金字塔中檢測出的關鍵點點,採集其所在高斯金字塔映像3σ鄰域視窗內像素的梯度和方向分布特徵。梯度的模值和方向如下:
(5-1)
L為關鍵點所在的尺度空間值,按Lowe的建議,梯度的模值m(x,y)按的高斯分布加成,按尺度採樣的3σ原則,鄰域視窗半徑為。
在完成關鍵點的梯度計算後,使用長條圖統計鄰域內像素的梯度和方向。梯度長條圖將0~360度的方向範圍分為36個柱(bins),其中每柱10度。5.1所示,長條圖的峰值方向代表了關鍵點的主方向,(為簡化,圖中只畫了八個方向的長條圖)。
方向長條圖的峰值則代表了該特徵點處鄰域梯度的方向,以長條圖中最大值作為該關鍵點的主方向。為了增強匹配的魯棒性,只保留峰值大於主方向峰值80%的方向作為該關鍵點的輔方向。因此,對於同一梯度值的多個峰值的關鍵點位置,在相同位置和尺度將會有多個關鍵點被建立但方向不同。僅有15%的關鍵點被賦予多個方向,但可以明顯的提高關鍵點匹配的穩定性。實際編程實現中,就是把該關鍵點複製成多份關鍵點,並將方向值分別賦給這些複製後的關鍵點,並且,離散的梯度方向長條圖要進行插值擬合處理,來求得更精確的方向角度值,檢測結果5.2所示。
至此,將檢測出的含有位置、尺度和方向的關鍵點即是該映像的SIFT特徵點。
6、關鍵點特徵描述
通過以上步驟,對於每一個關鍵點,擁有三個資訊:位置、尺度以及方向。接下來就是為每個關鍵點建立一個描述符,用一組向量將這個關鍵點描述出來,使其不隨各種變化而改變,比如光照變化、視角變化等等。這個描述子不但包括關鍵點,也包含關鍵點周圍對其有貢獻的像素點,並且描述符應該有較高的獨特性,以便於提高特徵點正確匹配的機率。
SIFT描述子是關鍵點鄰域高斯映像梯度統計結果的一種表示。通過對關鍵點周圍映像地區分塊,計算塊內梯度長條圖,產生具有獨特性的向量,這個向量是該地區映像資訊的一種抽象,具有唯一性。
Lowe建議描述子使用在關鍵點尺度空間內4*4的視窗中計算的8個方向的梯度資訊,共4*4*8=128維向量表徵。表示步驟如下:
1. 確定計算描述子所需的映像地區
特徵描述子與特徵點所在的尺度有關,因此,對梯度的求取應在特徵點對應的高斯映像上進行。將關鍵點附近的鄰域劃分為d*d(Lowe建議d=4)個子領域,每個子領域做為一個種子點,每個種子點有8個方向。每個子領域的大小與關鍵點方向分配時相同,即每個地區有個子像素,為每個子領域分配邊長為的矩形地區進行採樣(個子像素實際用邊長為的矩形地區即可包含,但由式(3-8),不大,為了簡化計算取其邊長為,並且採樣點宜多不宜少)。考慮到實際計算時,需要採用雙線性插值,所需映像視窗邊長為。在考慮到旋轉因素(方便下一步將座標軸旋轉到關鍵點的方向),如6.1所示,實際計算所需的映像地區半徑為:
(6-1)
計算結果四捨五入取整。
2. 將座標軸旋轉為關鍵點的方向,以確保旋轉不變性,如6.2所示。
旋轉後鄰域內採樣點的新座標為:
(6-2)
3. 將鄰域內的採樣點分配到對應的子領域內,將子領域內的梯度值分配到8個方向上,計算其權值。
旋轉後的採樣點座標在半徑為radius的圓內被分配到的子領域,計算影響子領域的採樣點的梯度和方向,分配到8個方向上。
旋轉後的採樣點落在子領域的下標為
(6-3)
Lowe建議子領域的像素的梯度大小按的高斯加權計算,即
(6-4)
其中a,b為關鍵點在高斯金字塔映像中的位置座標。
4. 插值計算每個種子點八個方向的梯度。
6.3所示,將由式(6-3)所得採樣點在子領域中的下標(圖中藍色視窗內紅色點)線性插值,計算其對每個種子點的貢獻。中的紅色點,落在第0行和第1行之間,對這兩行都有貢獻。對第0行第3列種子點的貢獻因子為dr,對第1行第3列的貢獻因子為1-dr,同理,對鄰近兩列的貢獻因子為dc和1-dc,對鄰近兩個方向的貢獻因子為do和1-do。則最終累加在每個方向上的梯度大小為:
(6-5)
其中k,m,n為0或為1。
5. 如上統計的4*4*8=128個梯度資訊即為該關鍵點的特徵向量。特徵向量形成後,為了去除光照變化的影響,需要對它們進行歸一化處理,對於映像灰階值整體漂移,映像各點的梯度是鄰域像素相減得到,所以也能去除。得到的描述子向量為,歸一化後的特徵向量為則
(6-7)
6. 描述子向量門限。非線性光照,相機飽和度變化對造成某些方向的梯度值過大,而對方向的影響微弱。因此設定門限值(向量歸一化後,一般取0.2)截斷較大的梯度值。然後,再進行一次歸一化處理,提高特徵的鑒別性。
7. 按特徵點的尺度對特徵描述向量進行排序。
至此,SIFT特徵描述向量產生。
描述向量這塊不好理解,我畫了個草圖,供參考:
7、SIFT的缺點
SIFT在映像的不變特徵提取方面擁有無與倫比的優勢,但並不完美,仍然存在:
1. 即時性不高。
2. 有時特徵點較少。
3. 對邊緣光滑的目標無法準確提取特徵點。
等缺點,如7.1所示,對模糊的映像和邊緣平滑的映像,檢測出的特徵點過少,對圓更是無能為力。近來不斷有人改進,其中最著名的有SURF和CSIFT。
8、總結
本人研究SIFT演算法一月有餘,鑒於相關知識的缺失,尺度空間技術和差分近似求導曾困我良久。Lowe在論文中對細節提之甚少,甚至隻字未提,給實現帶來了很大困難。經過多方查閱,實現,總結成此文。自認為是到目前為止,關於SIFT演算法最為詳盡的資料,現分享給你,望批評指正。
一同分享給你的還有同時實現的高斯模糊源碼,sift演算法源碼,見附錄1,2。源碼使用vs2010+opencv2.2實現。
zdd
2012年4月28日 於北師大
2012年5月17日15:33:23第一次修正
修正內容:第3.3部分內容,圖3.1,圖3.5。
修正後代碼:http://download.csdn.net/detail/zddmail/4309418
參考資料
1、David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004.
2、David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999
3、Matthew Brown and David Lowe Invariant Features from Interest Point Groups. In British Machine Vision Conference, Cardiff, Wales, pp. 656-665.
4、PETER J. BURT, MEMBER, IEEE, AND EDWARD H. ADELSON, The Laplacian Pyramid as a Compact Image Code. IEEE TRANSACTIONS ON COMMUNICATIONS, VOL. COM-3l, NO. 4, APRIL 1983
5、宋丹 10905056 尺度不變特徵變換匹配演算法Scale Invariant Feature Transform (SIFT)(PPT)
6、RaySaint 的部落格SIFT演算法研究http://underthehood.blog.51cto.com/2531780/658350
7、Jason Clemons SIFT: SCALE INVARIANT FEATURE TRANSFORM BY DAVID LOWE(ppt)
8、Tony Lindeberg Scale-space theory: A basic tool for analysing structures at different scales.1994
9、SIFT官網的Rob Hess <[email protected]> SIFT源碼
10、Opencv2.2 Andrea Vedaldi(UCLA VisionLab)實現的SIFT源碼 http://www.vlfeat.org/~vedaldi/code/siftpp.html, opencv2.3改用Rob Hess的源碼
11、科學計算中的偏微分方程有限差分法 楊樂主編
12、維基百科SIFT詞條:http://zh.wikipedia.org/zh-cn/Scale-invariant_feature_transform
13、百度百科SIFT詞條:http://baike.baidu.com/view/2832304.htm
14、其它互連網資料
附錄1 高斯模糊源碼
http://blog.csdn.net/zddmail/article/details/7450033
http://download.csdn.net/detail/zddmail/4217704
附錄2 SIFT演算法源碼
http://download.csdn.net/detail/zddmail/4309418
SIFT演算法詳解