轉載自http://bubblexc.com/y2011/163/
SIFT是我接觸最早的圖像局部特徵描述子之一,其實最初,始終覺得局部特徵描述子是些非常玄虛的東西。對於SIFT,這種感覺更是尤爲強烈,“尺度空間”“拉普拉斯高斯算子(LoG)”“高斯差分金字塔”,一系列讓人頭痛的概念。不過,反反覆覆看了幾次,漸漸也就有了感覺,在此總結一下。
物體識別的核心問題是將同一目標在不同時間、不同分辨率、不同光照、不同位姿情況下所成的像相相匹配。而爲了進行匹配,我們首先要合理的表示圖像。由於目標的自身狀態、場景所處的環境的影響,同一類物體在不同的圖像中所成的像往往會差別很大,但即使這樣,人們所能通過同一物體的一些局部共性來識別出物體(正如我們能將不同國家民族的人區分出來)。所謂局部特徵描述子就是用來刻畫圖像中的這些局部共性的,而我們也可以將一幅圖像映射(變換)爲一個局部特徵的集合。理想的局部特徵應具有平移、縮放、旋轉不變性,同時對光照變化、仿射及投影影響也應有很好的魯棒性。傳統的局部特徵往往是直接提取角點或邊緣,對環境的適應能力較差。1999年British Columbia大學 David G.Lowe 教授總結了現有的基於不變量技術的特徵檢測方法,並正式提出了一種基於尺度空間的、對圖像縮放、旋轉甚至仿射變換保持不變性的圖像局部特徵描述算子-SIFT(尺度不變特徵變換),這種算法在2004年被加以完善。
SIFT算法的實質可以歸爲在不同尺度空間上查找關鍵點(特徵點)的問題。所謂關鍵點,就是一些十分突出的點,這些點不會因光照條件的改變而消失,比如角點、邊緣點、暗區域的亮點以及亮區域的暗點,既然兩幅圖像中有相同的景物, 那麼使用某種方法分別提取各自的穩定點,這些點之間就會有相互對應的匹配點。而在SIFT中,關鍵點是在不同尺度空間的圖像下檢測出的具有方向信息的局部極值點。涉及到的最重要的兩步是:1.構建尺度空間 2.關鍵點檢測
- 構建尺度空間
先來談談尺度的問題。我們要精確表示的物體都是通過一定的尺度來反映的。現實世界的物體也總是通過不同尺度的觀察而得到不同的變化。比如說,對同一物體拍照,我們拍攝了一副近景,一副遠景,雖然兩幅圖片中都有這個物體,但這個物體確是處於兩個不同的尺度。SIFT特徵具有尺度不變性,就是說即使同一物體處於兩個不同的尺度的圖像中,我們仍可以通過提取圖像的SIFT特徵匹配成功。
圖像的尺度有多種表示方法(金字塔、八叉樹等等),在SIFT中Lowe教授採用了尺度空間理論。其主要思想是通過對原始圖像進行尺度變換,獲得圖像多尺度下的尺度空間表示序列,並檢測這個序列中的關鍵點。這樣圖片就被映射爲多個尺度上的關鍵點信息,儘管兩幅圖片是處於不同的尺度,但卻可以提取出在尺度變換中沒有改變的關鍵點,從而進行關鍵點匹配,進而識別出物體。
實際上,在尺度空間理論中,是通過對圖像進行模糊來模擬多尺度下的圖像。直觀上,圖像的模糊程度逐漸變大,模擬了人在距離目標由近到遠時目標在視網膜上的形成過程。文獻《Scale-space theory: A basic tool for analysing structures at different scales》證明,高斯核是唯一可以產生多尺度空間的核(其它核會對圖像造成模糊之外的其它影響)。一個圖像的尺度空間, L(x,y,σ) (σ 可以代表尺度的大小) ,定義爲原始圖像 I(x,y)與一個可變尺度的2維高斯函數 G(x,y,σ) 卷積運算。高斯函數:
- 關鍵點檢測
文獻《Scale-space theory: A basic tool for analysing structures at different scales》指出尺度規範化的LoG算子具有真正的尺度不變性。即我們可以在不同尺度的圖像(已經經過高斯卷積)上進行拉普拉斯運算(二階導數),並求極值點,從而求出關鍵點。但這樣做的運算量很大,於是SIFT中進行了近似處理:
對應DOG算子,我們要構建DOG金字塔
如下圖,我們可以通過高斯差分圖像看出圖像上的像素值變化情況。如果沒有變化,也就沒有特徵。特徵必須是變化儘可能多的點。本質上,DOG圖像描繪的是目標的輪廓。
關鍵點是由DOG空間的局部極值點組成的。爲了尋找DoG函數的極值點,每一個像素點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。具體來說,中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點。
至此就可以檢測出圖像中尺度不變的關鍵點,然後我們爲關鍵點賦予梯度方向,並利用關鍵點的周圍的像素梯度方向直方圖生成SIFT特徵描述子。具體過程可以參考以下資料(想整理的問題總結完了,偷個懶,>_<):
- SIFT的matlab程序,非常詳細 http://www.vlfeat.org/~vedaldi/code/sift.html
- SIFT tutorial http://www.aishack.in/2010/05/sift-scale-invariant-feature-transform/
- 一個非常詳細ppt教程,可用作教學 http://wenku.baidu.com/view/53021cf24693daef5ef73daf.html