SIFT算法学习总结
這兒僅作為我個人學習SIFT算法的總結!
算法存在的意義
SIFT(Scale-Invariant feature transform)算法是一種局部特征檢測的算法,該算法通過尋找圖像中的特征點(interest points ,or corner points)來進行特征點匹配。它在尺度空間尋找極值點,并精確計算出其位置信息,結合尺度,方向信息進行特征描述,該算法具有尺度,旋轉不變性,對圖像的亮度或者拍攝角也具有一定的不變性。SIFT算法在物體識別,機器人地圖感知與導航,圖像拼接,匹配,圖像追蹤等方面有廣泛應用。SIFT算法特點:1、SIFT特征是圖像的局部特征,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;2、 獨特性(Distinctiveness)好,信息量豐富,適用于在海量特征數據庫中進行快速、準確的匹配;3、 多量性,即使少數的幾個物體也可以產生大量的SIFT特征向量;4、高速性,經優化的SIFT匹配算法甚至可以達到實時的要求;5、可擴展性,可以很方便的與其他形式的特征向量進行聯合。算法核心步驟
算法實現原理
構建尺度空間
當用一個機器視覺系統分析未知場景時,計算機沒有辦法預先知識圖像中物體尺度,因此,我們需要同時考慮圖像在多尺度下的描述,獲知感興趣物體的最佳尺度。
同一物體在不同觀測精度下呈現出不同的表象就構成了一組尺度空間。尺度空間中個尺度圖像的模糊程度逐漸變大,能夠模擬人由近及遠的觀察目標,尺度越大,圖像越模糊。
人的視覺系統具有尺度不變性,不管離觀察目標有多遠多近,我們都能準確的識別出看到的物體,這表明我們能夠從不同尺度的圖像中找尋到相同的特征點。SIFT算法就在于尋找到了尺度不變性的方法。
所以在很多時候,我們會在將圖像構建為一系列不同尺度的圖像集,在不同的尺度中去檢測我們感興趣的特征。比如:在Harr特征檢測人臉的時候,因為我們并不知道圖像中人臉的尺寸,所以需要生成一個不同大小的圖像組成的金字塔,掃描其中每一幅圖像來尋找可能的人臉。
構造尺度空間是通過高斯模糊算子實現的
σ稱為尺度空間因子,它是高斯正太分布的方差,其值越大表明圖像被平滑程度越大,尺度越大,反之亦然。
構造高斯金字塔
高斯金字塔分為不同的組合不同的層,每一組我們稱之為一個八度(octave),每一組的分辨率大小不同,一般上一組是下一組倒數第三層圖像個點采樣得到的。每一組中有多層圖像,同一組中圖像分辨率大小相同,但是采用的尺度因子不同,也就是被平滑的程度不同,通過高斯金字塔的構建也就夠SIFT算法尺度空間的表示。
使用DOG近似LOG尋找極值點(關鍵點)
對圖像作LOG,即可得到圖像的邊緣信息。LOG是一種邊緣檢測算子。在此,LOG空間中的極值點被初步篩選特征點,由于LOG計算比較耗時,故采用DOG計算(DOG是LOG計算的近似)。那么是如何計算出圖像的DOG表示呢?我們發現,高斯金字塔中,不同層之間圖像平滑算子不同,可以將高斯金字塔的下層減去上層圖像得到DOG圖像。
得到圖像的DOG空間表示,在DOG空間中尋找極值點。通過比較當前點周圍8個點的大小與上層9個和下層9個點大小確定當前點是否是極值點,是極值點,就認定該點為初步篩選出的特征點。
去除低對比度和邊緣響應的點
到現在,我們已經得到部分關鍵點。但是現在存在幾個問題:
1、關鍵點的位置信息不精確
2、關鍵點中存在不好的點(特征點不具備很強的獨特性,使得識別魯棒性降低)
這一步的本質是移除DOG局部曲率不對稱的像素點。
關鍵點的精確定位
問題是我們找到的極值點并不一定是最低點。
通過擬和三維二次函數以精確確定關鍵點的位置和尺度(達到亞像素精度),同時去除低對比度的關鍵點和不穩定的邊緣響應點(因為DoG算子會產生較強的邊緣響應),以增強匹配穩定性、提高抗噪聲能力,在這里使用近似Harris Corner檢測器。
通過將尺度空間函數泰勒展開,如上圖D(x),對上式求導,令導數為0,得到精關鍵點確位置信息。
接下來去除低對比度的點。將代入D(X)即DOG空間中計算D(x)處的取值。若小于0.03,那么該點的對比度低,應該剔除。
接下來要做的是剔除邊緣響應的點
我們知道,沿著邊緣方向,高斯差分算子得到較小的主曲率,垂直于邊緣方向,得到的主曲率較大(如果該點不是邊緣,而是角點,那么兩邊得到的曲率應該差不多)。主曲率可由Hessian矩陣求得。
D(X)的主曲率和H的特征值成正比,令α為較大特征值,β為較小特征值,令α=γβ,則D(X)的主曲率和γ成正比。
在羅伊(SIFT創始人)論文中,設置γ=10,我們將主曲率大于一定閾值的點去除得到最終的特征點。
計算關鍵點方向(方向賦值)
現在我們得到了一系列不錯的關鍵點了,現在需要去除尺度和旋轉的不變性。
1、首先通過關鍵點所在的尺度選定其所在的高斯金字塔中的圖像。
2、圖像3σ鄰域窗口內像素的梯度和方向分布特征。梯度的模值和方向如下:
L為關鍵點所在的尺度空間值
完成計算后通過統計梯度和方向直方圖得到關鍵點的主方向。
方向直方圖的峰值則代表了該特征點處鄰域梯度的方向,以直方圖中最大值作為該關鍵點的主方向。為了增強匹配的魯棒性,只保留峰值大于主方向峰值80%的方向作為該關鍵點的輔方向。因此,對于同一梯度值的多個峰值的關鍵點位置,在相同位置和尺度將會有多個關鍵點被創建但方向不同。僅有15%的關鍵點被賦予多個方向,但可以明顯的提高關鍵點匹配的穩定性。實際編程實現中,就是把該關鍵點復制成多份關鍵點,并將方向值分別賦給這些復制后的關鍵點,并且,離散的梯度方向直方圖要進行插值擬合處理,來求得更精確的方向角度值。
特征描述子生成
至此,我們已經得到一個關鍵點的位置,尺度,方向信息,我們需要一個描述特征的方法。
SIFT描述子是關鍵點鄰域高斯圖像梯度統計結果的一種表示。通過對關鍵點周圍圖像區域分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域圖像信息的一種抽象,具有唯一性。
Lowe建議描述子使用在關鍵點尺度空間內4*4的窗口中計算的8個方向的梯度信息,共4*4*8=128維向量表征。表示步驟如下:
1、確定計算描述子所需的圖像區域
特征描述子與特征點所在的尺度有關,因此,對梯度的求取應在特征點對應的高斯圖像上進行。將關鍵點附近的鄰域劃分為d*d(Lowe建議d=4)個子區域,每個子區域做為一個種子點,每個種子點有8個方向。
2、 將坐標軸旋轉為關鍵點的方向,以確保旋轉不變性,如6.2所示。
3、 將鄰域內的采樣點分配到對應的子區域內,將子區域內的梯度值分配到8個方向上,計算其權值。
4、插值計算每個種子點八個方向的梯度。
5、統計的4*4*8=128個梯度信息即為該關鍵點的特征向量。特征向量形成后,為了去除光照變化的影響,需要對它們進行歸一化處理,對于圖像灰度值整體漂移,圖像各點的梯度是鄰域像素相減得到,所以也能去除。
6、 描述子向量門限。非線性光照,相機飽和度變化對造成某些方向的梯度值過大,而對方向的影響微弱。因此設置門限值(向量歸一化后,一般取0.2)截斷較大的梯度值。然后,再進行一次歸一化處理,提高特征的鑒別性。
7、 按特征點的尺度對特征描述向量進行排序。
算法使用
在opencv3中,SIFT不在直接可用,需要手動編譯,然后使用
參考資料:
http://blog.csdn.net/abcjennifer/article/details/7639681
http://blog.csdn.net/zddblog/article/details/7521424
http://aishack.in/tutorials/sift-scale-invariant-feature-transform-introduction/
http://blog.csdn.net/dcrmg/article/details/52561656
http://blog.csdn.net/dcrmg/article/details/52577555
總結
以上是生活随笔為你收集整理的SIFT算法学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中samba的权限详解,活用三
- 下一篇: mac显示无法连接adobe服务器,Ma