如何快速入門sift算法

SIFT:即尺度不變特徵變換(Scale-invariant feature transform,SIFT),是用於圖像處理領域的一種描述。這種描述具有尺度不變性,可在圖像中檢測出關鍵點,是一種局部特徵描述子

該算法將斑點檢測特徵矢量生成特徵匹配搜索等其他步驟完整結合在一起進行優化!


一、DoG尺度空間生成

將圖像的尺度空間表示成一個函數L(x,y,σ),它是由一個高斯濾波器與原圖像卷積而生成的圖像,即L(x,y,σ)=G(x,y,σ)⊗I(x,y)。一系列的σi,則可以生成一系列L(x,y,σi)圖像,此時我們把這一系列的L(x,y,σ)圖像稱爲原圖像的一個尺度空間表示。

下圖是5*5的高斯模板卷積計算示意圖。高斯模板是中心對稱的。

----------->>>>何爲尺度空間,快點我去了解?

I(x,y)表示原圖像。

G(x,y,σ)表示高斯濾波器

在sift算法中,提議在某一個尺度上對斑點的檢測,可以通過兩個相鄰高斯尺度空間的圖像相減,得到一個DoG的響應值圖像D(x,y,σ)

                                      (3.4)

上面特別值得注意的是尺度爲σ的高斯差分圖像由於尺度爲kσ與尺度爲σ的L圖像生成的。k爲兩相鄰尺度空間倍數的常數。

然後參照LoG的方法,對響應值圖像D(x,y,σ)進行非極大值抑制(局部最大值搜索);在位置空間和尺度空間定位斑點;

事實上DoG是對LoG(高斯拉普拉斯方法)方法的一種近似,DoG的響應值是對

 

的一種近似,可以通過兩者的二維曲線看出;如下圖3.2

然後通過熱傳導方程可知:t = σ^2  

然後在上式的基礎上進行有限差分運算,得到

其中k-1是個常數,並不影響極值點位置的求取。

在實際計算時,使用高斯金字塔每組中相鄰上下兩層圖像相減,得到高斯差分圖像;如下圖3.3所示,進行極值檢測得到DoG

DoG通過構建圖像高斯金字塔實現;將圖像金字塔共分爲O組(octave),每組有S層(level),下一組的圖像是由上一組的圖像按照隔點降採樣(就是對圖像降2倍分辨率)得到,這樣做可以減少計算量,有點類似於卷積神經網絡中的池化層的操作!

上述圖中每個組由五層不同尺度空間的圖像組成,相鄰兩層圖像相減後得到四層的DoG結果;然後斑點檢測就是在這四層DoG上進行的;其中的圖像相減就是簡單的減法操作,別想太複雜了!

使用DoG對LoG近似帶來的好處有哪些呢?

  1. LoG是使用兩個方向的高斯二階微分卷積核,而DoG是直接使用高斯卷積和,省去了對卷積和的生成的運算量;
  2. DoG保留了各個高斯尺度空間的圖像,這樣在生成某一空間尺度的特徵時,可以直接使用L(x,y,σ)=G(x,y,σ)⊗I(x,y)產生尺度空間圖像。無需再次生成該尺度的圖像;
  3. LoG對斑點檢測較其他檢測方法來說比較穩定,抗噪聲能力強,DoG是對LoG的近似和簡化,因此和LoG有相同的性質;

具體如何構建高斯差分金字塔呢?我們繼續往下面看!

二、高斯差分金字塔構建

在構建高斯金字塔時首先要確定尺度空間的各種參數;

尺度空間參數:σ

octave組數:O

每組的層數:S

在尺度空間中σ和O、S的關係如下:

其中σ0表示基準層尺度,O爲組octave的索引,S爲組內層的索引。關鍵點的尺度座標就是按關鍵點所在的組和組內的層

 

第一組第一張圖像是如何生成的?

這裏要分兩種情況:其一是把第一組的索引定爲0;其二是把第一組的索引定爲-1。

1、當索引爲0時,我們知道第一組第一層的圖像是由原圖像與σ0(一般設置爲1.6)的高斯濾波器卷積生成,那麼原圖像是誰呢?是I(x,y)嗎?不是!爲了圖像反走樣的需要,通常假設輸入圖像是經過高斯平滑處理的,其值爲σn=0.5,即半個像元。意思就是說我們採集到的圖像I(x,y),已經被σ=σn=0.5的高斯濾波器平滑過了。所以我們不能直接對I(x,y)用σ0的高斯濾波器平滑,而應該用\sigma = \sqrt{\sigma_0^2 - \sigma_n^2}的高斯濾波器去平滑I(x,y),即

FirstLayer(x,y) = I(x,y)\otimes G(x,y,\sqrt{\sigma_0^2 - \sigma_n^2})

其中FirstLayer(x,y)表示整個尺度空間爲第1組第1層的圖像,σo一般取1.6,σn=0.5。

2、第一組的索引定爲-1的情況。那麼首先第一個問題便是爲什麼要把索引定爲-1。如果索引爲0,如上面那種情況所示,整個尺度空間的第1組的第1層圖像已經是由原圖像模糊生成的了,那麼也就是說已經丟失了細節信息,那麼原圖像我們完全沒有利用上。基於這種考慮,我們先將圖像放大2倍,這樣原圖像的細節就隱藏在了其中。由上面一種情況分析,我們已經知識了I(x,y)看成是已經被σn=0.5模糊過的圖像,那麼將I(x,y)放大2倍後得到Is(x,y),則可以看爲是被2σn=1的高斯核模糊過的圖像。那麼由Is生成第1組第1層的圖像用的高斯濾波器的\sigma = \sqrt{\sigma_0^2 - (2_\sigma_n)^2}可以表示爲。

FirstLayer(x,y) = I_s(x,y)\otimes G(x,y,\sqrt{\sigma_0^2 - (2\sigma_n)^2})

其中FirstLayer(x,y)表示整個尺度空間爲第1組第1層的圖像,Is(x,y)是由I(x,y)用雙線性插值放大後的圖像。σo一般取1.6,σn=0.5。

對上述總結:octave索引可能爲負值,第一組索引通常設爲0或者-1,當設爲-1時,圖像在計算高斯空間前先將尺度擴大一倍。爲了圖像反走樣的需要,通常假設輸入圖像是經過高斯平滑處理的,其中sigma_n=0.5,即半個像元,但在組O=-1,圖像使用雙線性插值擴大一倍,此時的sigma_n=1.0

取式(3.4)中的k爲組內總層數的倒數,即

3.6

在構建高斯金字塔時,組內每層的尺度座標按如下公式計算:

3.7

其中初始尺度,lowe取,s爲組內的層索引,不同組相同層的組內尺度座標相同。組內下一層圖像是由前一層圖像按進行高斯模糊所得。式(3.7)用於一次生成組內不同尺度的高斯圖像,而在計算組內某一層圖像的尺度時,直接使用如下公式進行計算:

     3.8

該組內尺度在方向分配和特徵描述時確定採樣窗口的大小。

由上,式(3.4)可記爲

(3.9)

圖3.5爲構建DOG金字塔的示意圖,原圖採用128*128的jobs圖像,擴大一倍後構建金字塔。

尺度空間生成了多少幅圖像?

取上一張的倒數第3張圖像隔行採樣後作爲下一組的第一張圖像?

爲什麼用第i-1層的圖像生成第i層的圖像?

請看這位博主的講解:尺度空間生成了多少幅圖像?

三、特徵點的搜索與定位

斑點的搜索是通過同一組內各DoG相鄰層之間比較完成的。爲了尋找尺度空間的極值點,每一個採樣點要和它所有的相鄰點進行比較,看其是否比它的圖像域和尺度域的相鄰點大或小。對於其中的任意一個檢測點都要和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像位置空間都檢測到極值點。也就是,比較是在一個3×3的立方體內進行。

搜索過程從每組的第二層開始,以第二層爲當前層,對第二層的DoG圖像中的每個點取一個3×3的立方體,立方體上下層爲第一層與第三層。這樣,搜索得到的極值點既有位置座標(DoG的圖像座標),又有空間尺度座標(層座標)。當第二層搜索完成後,再以第三層作爲當前層,其過程與第二層的搜索類似。當S=3時,每組裏面要搜索3層。如圖4.6所示

image

                                                                                      圖4.6 在DoG中極值點的搜索與定位

以上極值點的搜索都是在離散空間中進行的,檢測到的極值點並不是真正意義上的極值點。如下圖4.7所示

image

                                                                     圖4.7 離散空間極值點與連續空間極值點之間的關係

利用已知的離散空間點插值得到連續空間極值點的方法叫做子像元插值

如何進行子像元插值?

請看這位博主的講解:子像元插值

如何刪除邊緣效應?

一個定義不好的高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。

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右側爲消除邊緣響應後的關鍵點分佈圖。

  

四、特徵點方向分配

爲了使描述符具有旋轉不變性,需要利用圖像的局部特徵爲給每一個關鍵點分配一個基準方向。使用圖像梯度的方法求取局部結構的穩定方向。對於在DOG金字塔中檢測出的關鍵點點,採集其所在高斯金字塔圖像3σ鄰域窗口內像素的梯度和方向分佈特徵。梯度的模值和方向如下:

(5-1)

L爲關鍵點所在的尺度空間值,按Lowe的建議,梯度的模值m(x,y)按的高斯分佈加成,按尺度採樣的3σ原則,鄰域窗口半徑爲

在完成關鍵點的梯度計算後,使用直方圖統計鄰域內像素的梯度和方向。梯度直方圖將0~360度的方向範圍分爲36個柱(bins),其中每柱10度。如圖5.1所示,直方圖的峯值方向代表了關鍵點的主方向,(爲簡化,圖中只畫了八個方向的直方圖)。

方向直方圖的峯值則代表了該特徵點處鄰域梯度的方向,以直方圖中最大值作爲該關鍵點的主方向。爲了增強匹配的魯棒性,只保留峯值大於主方向峯值80%的方向作爲該關鍵點的輔方向。因此,對於同一梯度值的多個峯值的關鍵點位置,在相同位置和尺度將會有多個關鍵點被創建但方向不同。僅有15%的關鍵點被賦予多個方向,但可以明顯的提高關鍵點匹配的穩定性。實際編程實現中,就是把該關鍵點複製成多份關鍵點,並將方向值分別賦給這些複製後的關鍵點,並且,離散的梯度方向直方圖要進行插值擬合處理,來求得更精確的方向角度值,檢測結果如圖5.2所示。

 

至此,將檢測出的含有位置、尺度和方向的關鍵點即是該圖像的SIFT特徵點。

關鍵點特徵描述

通過以上步驟,對於每一個關鍵點,擁有三個信息:位置、尺度以及方向。接下來就是爲每個關鍵點建立一個描述符,用一組向量將這個關鍵點描述出來,使其不隨各種變化而改變,比如光照變化、視角變化等等。這個描述子不但包括關鍵點,也包含關鍵點周圍對其有貢獻的像素點,並且描述符應該有較高的獨特性,以便於提高特徵點正確匹配的概率。 

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特徵描述向量生成。

描述向量這塊不好理解,我畫了個草圖,供參考:

參考博文:

1、https://blog.csdn.net/u010440456/article/details/81483145

2、https://www.cnblogs.com/ronny/p/3886013.html

3、https://www.cnblogs.com/ronny/p/4028776.html

對上述博主的講解表示感謝,已經瞭解差不多了,我按照自己的理解加博主的講解,重新排版了一下,爲了後續的繼續學習做個整理!不會用作商業用途!!!再次表示感謝!

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