SIFT算法原理(3)-確定關鍵點的主方位,構建關鍵點描述符


介紹官網:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html

在極值點的精確定位后,還需要為找到的特征點進行方向匹配;

特征點方向分配:

   可參考:SIFT算法詳解SIFT算法原理詳解

對於在DOG金字塔中檢測出的關鍵點點,采集其所在高斯金字塔圖像3σ領域窗口內像素的梯度和方向分布特征。梯度的模值和方向如下:

 

也就是說我們在高斯差分圖中找到了極值點,再回到原來的高斯金字塔圖中尋找與σ(尺度)相近的高斯圖像, 在以關鍵點為中心的鄰域窗口內采樣,並用直方圖統計鄰域像素的梯度方向。梯度直方圖的范圍是0~360度,其中每10度一個方向,總共36個方向。直方圖的峰值則代表了該關鍵點處鄰域梯度的主方向,即作為該關鍵點的方向。

        考慮離極值點近的方向的像素點對極值點影響較大,我們會做一個高斯濾波(1.5σ),這樣就有一個權重,計算方向直方圖時,需要用一個參數等於關鍵點所在尺度1.5倍的高斯權重窗對方向直方圖進行加權,上圖中用藍色的圓形表示,中心處的藍色較重,表示權值最大,邊緣處顏色潛,表示權值小。如下圖所示,該示例中為了簡化給出了8方向的方向直方圖計算結果,實際sift創始人David Lowe的原論文中采用36方向的直方圖。

權值為幅度m(x,y )和貢獻因子的乘積。貢獻因子是采樣點到關鍵點(窗口中心)距離的量度,距離越大,貢獻因子越小.直方圖的峰值代表了該關鍵點處鄰域梯度的主方向.

 

 

 

特征點主方向的確定

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

 

為了防止某個梯度方向角度因受到噪聲的干擾而突變,我們還需要對梯度方向直方圖進行平滑處理。Opencv  所使用的平滑公式為:

其中i∈[0,35],分別表示平滑前和平滑后的直方圖。由於角度是循環的,即00=3600,如果出現h(j),j超出了(0,…,35)的范圍,那么可以通過圓周循環的方法找到它所對應的、在00=3600之間的值,如h(-1) = h(35)。

梯度直方圖的拋物線插值

 

 

假設我們在第i個小柱子要找一個精確的方向,那么由上面分析知道:

設插值拋物線方程為h(t)=at2+bt+c,其中a、b、c為拋物線的系數,t為自變量,t∈[-1,1],此拋物線求導並令它等於0。

h(t)´=0 tmax=-b/(2a)

現在把這三個插值點帶入方程可得:

 

得到特征點的主方向后,對於每個特征點可以得到三個信息(x,y,σ,θ),即位置、尺度和方向。由此可以確定一個SIFT特征區域,一個SIFT特征區域由三個值表示,中心表示特征點位置,半徑表示關鍵點的尺度,箭頭表示主方向。具有多個方向的關鍵點可以被復制成多份,然后將方向值分別賦給復制后的特征點,一個特征點就產生了多個坐標、尺度相等,但是方向不同的特征點。

構建關鍵點描述符

上面我們已經找到圖片的關鍵點,但是我們只找到一個圖片的關鍵點是不可以的,必須找到兩個圖片的關鍵點並把他們匹配起來,因此我們就需要用描述符將其匹配;

那么描述符是什么呢?

描述符是一組向量

       使用一組向量來描述關鍵點也就是生成特征點描述子,這個描述符不只包含特征點,也含有特征點周圍對其有貢獻的像素點。描述子應具有較高的獨立性,以保證匹配率。
特征描述符的生成大致有三個步驟:
1.校正旋轉主方向,確保旋轉不變性。

 

為了保證特征矢量的旋轉不變性,要以特征點為中心,在附近鄰域內將坐標軸旋轉θ(特征點的主方向)角度,即將坐標軸旋轉為特征點的主方向。旋轉后鄰域內像素的新坐標為:
在這里插入圖片描述

參考:為什么拉普拉斯算子具有旋轉不變性

梯度直方圖的生成

將鄰域內的采樣點分配到對應的子區域內,將子區域內的梯度值分配到8個方向上,計算其權值。

旋轉后的采樣點 落在子區域的下標為

 

 

2.生成描述子,最終形成一個128維的特征向量 

旋轉后以主方向為中心取 8×8的窗口。下圖所示,左圖的中央為當前關鍵點的位置,每個小格代表為關鍵點鄰域所在尺度空間的一個像素,求取每個像素的梯度幅值與梯度方向,箭頭方向代表該像素的梯度方向,長度代表梯度幅值,然后利用高斯窗口對其進行加權運算。最后在每個4×4的小塊上繪制8個方向的梯度直方圖,計算每個梯度方向的累加值,即可形成一個種子點,如右圖所示。每個特征點由4個種子點組成,每個種子點有8個方向的向量信息。這種鄰域方向性信息聯合增強了算法的抗噪聲能力,同時對於含有定位誤差的特征匹配也提供了比較理性的容錯性。

 

 與求主方向不同,此時每個種子區域的梯度直方圖在0-360之間划分為8個方向區間,每個區間為45度,即每個種子點有8個方向的梯度強度信息。
在實際的計算過程中,為了增強匹配的穩健性,Lowe建議在這里插入圖片描述
通過對特征點周圍的像素進行分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域圖像信息的一種抽象,具有唯一性。

3.歸一化處理,將特征向量長度進行歸一化處理,進一步去除光照的影響。

在大佬論文中使用三線差值?(這一部分占時沒看太懂)

 

采樣點在子區域中的下標(x'',y'')  (圖中藍色窗口內紅色點)線性插值,計算其對每個種子點的貢獻。如圖中的紅色點,落在第0行和第1行之間,對這兩行都有貢獻。對第0行第3列種子點的貢獻因子為dr,對第1行第3列的貢獻因子為1-dr,同理,對鄰近兩列的貢獻因子為dc和1-dc,對鄰近兩個方向的貢獻因子為do和1-do。則最終累加在每個方向上的梯度大小為:

其中k,m,n為0(像素點超出了對要插值區間的四個鄰近子區間所在范圍)或為1(像素點處在對要插值區間的四個鄰近子區間之一所在范圍)。 

特征描述子

如上統計的4*4*8=128個梯度信息即為該關鍵點的特征向量。
      特征向量形成后,為了去除光照變化的影響,需要對它們進行歸一化處理,對於圖像灰度值整體漂移,圖像各點的梯度是鄰域像素相減得到,所以也能去除。得到的描述子向量為H=(h1,h2,.......,h128),歸一化后的特征向量為L=(L1,L2,......,L128),則

描述子的門限化

非線性光照,相機飽和度變化對造成某些方向的梯度值過大,而對方向的影響微弱。因此設置門限值(向量歸一化后,一般取0.2)截斷較大的梯度值(大於0.2的則就令它等於0.2,小於0.2的則保持不變)。然后再進行一次歸一化處理,提高特征的鑒別性。

描述子相關分析

用一組圖來概括描述子的生成過程

描述子生成總括

 

 

 參考:SIFT算法原理詳解

https://blog.csdn.net/qq_37328774/article/details/88617952

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM