1. 程式人生 > >SIFT學習筆記(結合matlab原始碼)

SIFT學習筆記(結合matlab原始碼)

一、演算法流程

1、生成高斯金字塔,並由此生成差分高斯金字塔(DoG),該過程完成尺度空間的構建,以便後續的空間極值點檢測。

2、穩定關鍵點的精確定位、去除不穩定特徵點

3、穩定關鍵點資訊分配

4、關鍵點匹配

二、演算法中每一步的演算法原理以及原始碼解釋

(一)構建尺度空間

1)尺度空間及尺度空間的連續性

尺度空間:通過對原始影象進行尺度變換,獲得影象多尺度下的尺度空間表示序列,以便對尺度空間的主輪廓提取,獲得特徵向量,實現邊緣、角點檢測和不同解析度上的特徵提取。

高斯核是唯一產生多尺度空間的核,使用高斯核對影象模糊不會引入噪聲,因此用高斯核構建影象尺度。

     一個影象的尺度空間定義為一個變換尺度的高斯函式

和原影象的卷積,即


      其中,m,n表示高斯模板的維度(確定)。(x, y)代表影象的畫素位置。是尺度空間因子,值越小表示影象被平滑的越少,相應的尺度也就越小。大尺度對應於影象的概貌特徵,小尺度對應於影象的細節特徵。

     尺度空間O代表第幾個八度(組),S代表八度中的第幾層。

      尺度空間是自然存在的,不是人為創造的!!高斯卷積只是表現尺度空間的一種形式。                                                       

     為了讓尺度體現其連續性,在簡單下采樣的基礎上添加了多尺度的高斯濾波。一幅影象可以產生幾組(Octave)圖

像,一組影象又包括幾層(Interval)影象,並且組數和金字塔的層數相等。

      通過在每個八度中多構造三幅高斯影象,達到了尺度空間連續的效果,這一效果帶來的直接的好處是在尺度空間的極值點確定過程中,我們不會漏掉任何一個尺度上的極值點,而是能夠綜合考慮量化的尺度因子所確定的每一個尺度!

2)構建高斯金字塔

     影象金字塔模型是指,將原始影象不斷降階取樣,得到一系列大小不一的影象,由大到小,自底向上構成的塔狀模型。原始影象為金字塔的第一層,每次降取樣得到的新影象為金字塔的一層(每層一張影象)。

高斯金字塔共包含O組影象,每組影象有 S+3S+3 層,其中M,N分別為原始影象的行數和列數。

構建組的過程:

①擴大影象

②在該尺度上進行高斯模糊,構成一個八度(簡單地說八度就是在特定尺寸(長寬)下,經不同高斯核模糊的影象的集合。八度的集合是高斯金字塔。)

③在該八度下最模糊的一幅畫降取樣,併成為下一個八度的初始影象。


3)構建差分高斯金字塔

1、步驟:①對同八度的兩幅相鄰的影象做差得到插值影象

      ②所有八度的插值影象集合構成差分高斯金字塔

2、意義:差分高斯函式是尺度規範化的高斯拉普拉斯函式的近似,而高斯拉普拉斯函式的極大值和極小值點是一種非常穩定的特徵點(與梯度特徵、Hessian特徵和Harris角點相比)有了這些基礎,就可以放開手腳從差分高斯金字塔中找點了!

(二)穩定關鍵點的精確定位

1)關鍵點

關鍵點是一些十分突出的點,它不會因光照條件的改變而消失,如焦點、邊緣點、暗區域的亮點以及亮區域的暗點。關鍵點是在不同的尺度空間的影象下檢測出的具有方向資訊的區域性極值點,特徵點的三個特徵是:尺度、方向、大小

匹配工作就是:提取兩幅圖片各自的穩定點,然後建立這些點之間的匹配關係。

(2)閾值檢測

由於不能保證圖片就是完全沒有噪聲的,所以在推選之前我們要排除一些對比度比較低的點,這些點很不穩定,容易受到干擾,本著寧缺毋濫的原則,先把不穩定因子排除。這個閾值一般是自己設定的,在matlab中設定它為:0.5*T/S,這裡的T lowe 定義它為0.04,s是該點所在的層。



(3)極值檢測

在sift演算法裡面極值點的檢測方法是對影象中的每一個點進行遍歷,判斷每一個點是否是極值,判斷的標準是,把這個點與相鄰的層,上下層9+9=18個點和同一層中8個點,共18+8=26個點進行比較,看這個點是否是最大值,還是最小值,若是,則保留下來進入下一層計算。



4)極值點精確定位——擬合+去除邊緣狀的點(去除邊緣相應)

            

      計算機中儲存的影象資料是離散的,而我們之前找到的極值點也就是離散空間中的極值點,但是離散空間中的極值點並不是真實的連續空間中的極值點。所以在這一輪的選舉中,我們的目標就是找到精確的極值點(成仙之前當然要經過考驗)其實這裡的精確點的位置,是一個亞畫素級別的概念,比如一個數的個位十位百位都確定了,要更加精細的去找這個數的小數點後的那個資料,所以首先用插值來計算。

      



       需要對DoG空間進行擬合處理,以找到極值點的精確位置和尺度。通過三元二次函式擬合來精確確定關鍵點的位置和尺度。高數中提過,函式f(x)在x0處可以進行泰勒展開。於是我們也在這個檢測到的極值點處處,對它進行泰勒級數展開(這裡只展開到二階項,高次項砍掉),以此來擬合這個三維二次函式。於是得到

       把上面的式子寫成向量的形式:。於是就擬合出來了該點附近的函數了,表示擬合之後連續空間下面的插值點座標,設則表示:相對於插值中心的偏移量,可以用偏移量表示:

                                                        

      對式子求導,得,讓導數等於0,就可以得到極值點下的相對於插值中心的偏移量:,把該式代入可以得到該極值點下的極值為。Ok,其實到這裡,已經把精確的極值點找到了!!

       一個定義不好的高斯差分運算元的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。DOG 運算元會產生較強的邊緣響應,需要剔除不穩定的邊緣響應點。

      

(三)穩定關鍵點資訊分配

要想進行特徵點匹配需要知道特徵點的描述向量。之前檢測中能解決尺度變化問題,接下來想通過描述來解決旋轉問題。旋轉的解決方法是尋找一個主方向,這樣其他方向可以根據離這個主方向的角度來確定。

(1)尋找主方向。

在特徵點附近的一個鄰域(圓形區域)內計算每個點的梯度幅值和角度,根據角度作為橫座標計算直方圖,直方圖縱座標為幅值的疊加,選取縱座標最大的方向作為特徵點的主方向。


2)選取主方向後需要得到描述子,為了消除旋轉影響,首先將特徵點附近需要考慮的鄰域根據主方向進行旋轉:

         

然後將這個鄰域分為四個子區域(也可以是16個),每個子區域包含4*4區域,每個畫素都有梯度方向,利用直方圖統計每個子區域在8個方向的梯度值大小的統計值:

      這樣每個子區域就有8維的向量,連起來就是32維向量,如果是16個子區域就是128維向量,也就是SIFT描述子。 利用關鍵點鄰域畫素的梯度方向分佈特性為每個關鍵點指定方引數,使運算元具備旋轉不變性。

(x,y)處梯度的模值和方向公式。其中L所用的尺度為每個關鍵點各自所在的尺度。至此,影象的關鍵點已經檢測完畢,每個關鍵點有三個資訊:位置,所處尺度、方向,由此可以確定一個SIFT特徵區域。

      梯度直方圖的範圍是0~360度,其中每10度一個柱,總共36個柱。隨著距中心點越遠的領域其對直方圖的貢獻也響應減小.Lowe論文中還提到要使用高斯函式對直方圖進行平滑,減少突變的影響。

      在實際計算時,我們在以關鍵點為中心的鄰域視窗內取樣,並用直方圖統計鄰域畫素的梯度方向。梯度直方圖的範圍是0~360度,其中每45度一個柱,總共8個柱, 或者每10度一個柱,總共36個柱。Lowe論文中還提到要使用高斯函式對直方圖進行平滑,減少突變的影響。直方圖的峰值則代表了該關鍵點處鄰域梯度的主方向,即作為該關鍵點的方向

                                                

                                                                                         直方圖中的峰值就是主方向,其他的達到最大值80%的方向可作為輔助方向

                                            

由梯度方向直方圖確定主梯度方向

該步中將建立所有scale中特徵點的描述子(128維)


(四)關鍵點匹配

關鍵點的匹配主要是通過將des1中的每一個關鍵點資訊與des2中的每一個關鍵點求最近鄰距離,並通過閾值的限定來進行的。