SIFT特徵詳細描述 下

2.3 找到特徵點

到現在,我們已經生成了一個尺度空間,並且使用尺度空間來計算Difference of Gaussian,它們被用於計算尺度不變性的Laplacian of Gaussian的近似。通過得到的DoG圖像可以找到好的特徵點,分爲兩個子步驟:

1. 在DoG圖像中找到極大或極小像素點

2. 找到子像素級的極大極小值點

極大或極小像素點

第一步是粗糙地找到極大極小值像素點,這很簡單,我們可以掃描每個像素並且檢測所有的鄰接像素點,鄰接像素點不僅包括當前圖像中的鄰接像素,而且包括上一層和下一層圖像中的鄰接像素。

圖2.6 在DoG圖像中找極大極小像素點

clip_image002

X標記當前像素點,綠色的圈標記鄰接像素點,用這個方式,最多檢測26個像素點。X被標記爲特徵點,如果它是所有鄰接像素點的最大值或最小值點。

通常對於非極大或極小值點不需要遍歷所有26個鄰接像素點,少數的幾個檢測就足夠拋棄它。注意最高層和最底層的尺度是不需要檢測的,經過上一個操作,我們從每組圖像中得到4幅DoG圖像,只需要對中間的兩幅DoG圖像進行極大極小值像素點進行檢測。

這步結束後,所標記的點就是近似的極大極小值點,之所以說是“近似的”是因爲極大極小值點都不會巧好在像素點的位置上,它一般位於像素的中間,但是我們無法直接訪問像素間的數據,所以我們需要通過插值得到子像素的位置。如下圖所示:

clip_image004

 
 

圖2.7 子像素的極大極小像素點

紅色的叉標記圖像中的像素,但是真正的極值點是綠色的位於像素間的點。

子像素的極大或極小像素點

使用可用的像素數據,可以生成子像素的值,它通過近似的特徵點附近圖像的Taylor展開來計算,數學上的形式如下:

clip_image006

通過對x求偏導並將結果置爲零,我們可以簡單地計算出方程的極值,從而得到子像素特徵點的位置,這些子像素點可以增加匹配和算法穩定性的機率。

若子像素點與近似特徵點間的偏移量大於0.5,則按照偏移近似特徵點的方向相應改變(移動)特徵點,然後再把該點當做近似特徵點,重複該操作,直到子像素點與近似特徵點間的偏移量小於等於0.5。

實現細節

圖2.8給出了經過上面兩個子步驟得到的子像素極大極小值點,SIFT算法的作者建議生成兩個極值點圖像,所以我們只需要4幅DoG圖像。爲了生成4幅DoG圖像,我們需要5幅高斯模糊的圖像,因此每組圖像需要5層模糊圖像。該圖中,我們只顯示了一組圖像,但程序中要對每組圖像都這麼執行。

clip_image008

 
 

圖2.8 在一組DoG圖像中找出特徵點

2.4 消除邊界和低對比度的特徵

從上一步能產生許多特徵點,其中的一些特徵點位於邊界,或者亮度上沒有足夠的對比度。在這些情況下,它們都不是有用的特徵,所以我們要拋棄它們。我們使用類似於Harris Corner檢測中所使用的方法來去除位於邊界上的特徵,通過檢測亮度來去除低對比度的特徵。

移除低對比度的特徵

如果從DoG圖像中檢測到的特徵點的亮度值少於某個值,那麼該特徵點就被拒絕。因爲我們已經得到子像素的特徵點(極大或極小像素點),我們可以得到子像素的亮度,如果亮度少於某個值,那麼就拒絕它。

移除邊界特徵

要想移除邊界特徵,我們要計算特徵點附近高斯模糊圖像的梯度。基於特徵點附近的圖像,有三種可能的特徵:

1. 平坦特徵

特徵兩個方向的梯度值都很小。

2. 邊界特徵

該特徵一個方向的梯度值很大(垂直於邊界的方向),另一個方向的梯度值很小(沿着邊界的方向)。

3. 直角特徵

該特徵兩個方向的梯度值都很大。

直角特徵是很好的特徵點,所以我們想得到直角特徵,如果特徵點的兩個方向的梯度值都很大,那麼就讓它通過,否則就拒絕它。這可以通過Hessian矩陣實現,使用這個矩陣我們可以很容易地檢測它是不是直角特徵。在SIFT算法中,不需要像Harris corner檢測直接計算Hessian矩陣的兩個特徵值,而只需要計算兩個特徵值的積與和的比率。

實現細節

下面用例子來說明,如圖2.9所示。

圖2.9 在所有特徵點中篩選出直角特徵點

clip_image010

兩個包含特徵點的圖依次通過這兩個測試:對比度測試和邊界測試,並去掉未通過測試的特徵點。

2.5 分配特徵點的方向

在上個步驟,我們得到了合理的特徵點,並且這些特徵點被測試是在位置上穩定的,容易識別匹配的。由於我們已經知道特徵點是在哪個尺度被檢測到的,所以這些特徵點也是尺度不變的。接下來要對每個特徵點賦一個方向,以使這些特徵點具有旋轉不變性。特徵點所擁有的不變性越多越好。

特徵點的方向

在每個特徵點周圍計算圖像的梯度方向和大小,我們可以得到最顯著的方向,並且將該方向賦給該特徵點。後面的操作都相對該方向進行計算,確保了旋轉不變性。

clip_image011

 
 

圖2.10 將高斯模糊圖像分解爲梯度大小圖和方向圖

在特徵點附近,我們創建一個方向收集區域來控制該特徵點影響的範圍,方向收集區域的大小依賴於它所在圖像的尺度,尺度越大,收集的區域越大。在方向收集區域中每個像素點的梯度大小和方向用下面的公式計算,從而得到另外兩幅圖,分別是梯度的大小圖和方向圖。

clip_image013

我們用一個直方圖來統計方向收集區域中像素的平均方向,在該直方圖中,將360度的方向分成36個bins,每個bin包含10度。假設方向收集區域中某個像素點的梯度方向是18.75度,把它放入10-19度的bin中,並且加入到bin中的量與該像素點的梯度大小成正比。

一旦對方向收集區域中的每個像素點都執行了這個操作後,直方圖在某個bin上出現最高峯值。如圖2.11直方圖的最高峯值在20-29度,所以特徵點的方向被賦值爲3(第三個bin)。並且所有大於最高峯80%的峯值也被轉化爲一個新的特徵點,這個新的特徵點和原來的特徵點一樣擁有相同的位置和尺度,但是新特徵點的方向是另一個峯值。所以方向將一個特徵點分爲多個特徵點。

圖2.11 特徵點的方向收集區域中的直方圖

clip_image015

實現細節

如前面所述,在直方圖的統計方向的過程中,需要往相應的bin中加入與當前像素梯度相關的量,這個量應是將圖2.10中的梯度大小圖進行1.5倍圖像尺度量的高斯模糊後的梯度大小值。

方向收集區域的窗口大小等於1.5倍圖像尺度量的高斯窗口的大小。

2.6 生成SIFT描述子

這是SIFT算法的最後一步,現在我們已經得到了擁有尺度不變性和旋轉不變性的特徵點,接下來要爲每個特徵點創建一個唯一標識它的“指紋”,SIFT算法作者將它稱爲SIFT描述子(descriptor)。所生成的SIFT描述子既要能讓相同場景中圖像的特徵點能夠正確匹配,而且還要讓不同場景中圖像的特徵點能夠正確區分。

爲了得到這樣的SIFT描述子,我們將特徵點周圍16*16的窗口分解爲16個4*4的子窗口,圖2.12顯示了分解的過程。在每個4*4的子窗口中,計算出梯度的大小和方向,並用一個8個bin的直方圖來統計子窗口的平均方向,如圖2.13所示。

圖2.12 將特徵點周圍16*16的窗口分解爲16個4*4的子窗口

clip_image017

圖2.13每個子窗口創建一個8 bin的直方圖

clip_image019

梯度方向在0-44度範圍的像素點被放到第一個bin中,45-89度範圍的像素點被放到下一個bin中,依此類推。同樣加入到bin中的量依賴於該像素點梯度的大小。與之前不同的是,加入的量不僅與像素點的梯度大小相關,而且還依賴離特徵點的距離,這樣遠離特徵點的像素點會加入較少的量到直方圖中。這通過一個高斯加權函數來實現,這個函數生成一個加權值(像一個二維的鐘形曲線),用它乘以16*16的窗口中每個像素點的梯度大小,得到加權後的梯度大小,距離特徵點越遠,要加入直方圖的像素點的梯度大小越小。

這樣每個4*4的子窗口都對應一個8 bin的直方圖,且直方圖中加入的值是像素的用高斯加權後的梯度大小,而特徵點周圍16*16的窗口中包含16個4*4的子窗口,共有16*8=128個數,然後將這128個數組成的向量進行單位化,單位化後的128維向量就是SIFT的描述子。

實現細節

在最後得到SIFT描述子前,我們還要處理兩個問題:旋轉依賴和亮度依賴。

由於SIFT描述子中包含梯度方向信息,如果我們旋轉圖像,那麼所有的梯度方向都會改變。爲了實現旋轉不變性,要使用2.5中計算出的特徵點方向,在使用每個4*4子窗口中像素的梯度方向時,要先減去特徵點方向。

由於某些圖像亮度變化較大,這可能會導致特徵點周圍像素的梯度大小變化過大,也就是說在單位化後的SIFT描述子中某些維度的量要遠大於其它維度的量。爲了減少亮度的依賴,我們將128維SIFT描述子中大於0.2的維度量截取爲0.2,並對最後的128爲描述子再做一次單位化。

通過這系列操作,我們最後得到了具有位置穩定、尺度不變性、旋轉不變性和較少亮度依賴的SIFT描述子。

三、程序說明

下面是程序的截圖,從圖中找到了657個具有穩定位置的特徵點,爲此丟棄了1437個對比度低的特徵點或邊界特徵點。在特徵點方向的計算中,將具有穩定位置的特徵點進行分離,增加了特徵點的數量,產生了1161個的特徵點。

clip_image021

左圖是原始輸入的圖像,右圖是顯示了657個穩定特徵點的位置,關聯的直線的方向表示最大的梯度方向(未顯示其它方向的特徵點),直線的長度是10倍的最大梯度大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章