再讀SIFT理論及原始碼

2021-08-03 23:46:31 字數 3191 閱讀 3711

sift特徵點檢測及描述

引言

sift特徵點,尺度不變的特徵變換。其具有尺度不變性(高斯差分金字塔),旋轉不變性(主方向),部分放射不變性(在統計梯度方向直方圖時對直方圖進行了高斯平滑)。

sift特徵分為兩部分,第乙個是要檢測一幅影象中關鍵點的位置,第二個是要生成乙個描述子來表示這個點位置。

名詞解釋

1.     高斯模糊:理論證明高斯核函式是實現尺度不變的唯一線性函式,通過將高斯函式與原影象進行卷積,根據卷積引數的大小可以得到不同的高斯模糊影象,這些影象尺度不變。

2.     降取樣:一幅影象按照最近鄰的原則進行收縮至原來的一半。

3.    高斯模板:對影象的每個畫素做模糊時,理論上所有的點均可以對該點做貢獻,但是在3之外的點可以忽略不計,模板大小即為(m,n)=(6+1, 6+1)。並且模板上的點按照距離該畫素遠近分配乙個權值,體現為:

lowe建議5*5的模板。

4.     高斯金字塔:金字塔有組和層兩個概念,第一組在最底下,每一組最低層都是上一組最高層經過降取樣得到的,也就是說當前組的下一組比當前組要一半,這樣看起來就像是一座塔了,組數記為o。層是每組之中有的,下一層是由當前層經過高斯模糊得來的,層數記為s,一般s=3~5。

5.    差分金字塔:早年的實驗證明高斯-拉普拉斯函式的極值點是影象最穩定的特徵點,而高斯差分運算元(dog)可以代替拉普拉斯運算元,因此在實際計算中,將高斯金字塔組內每兩層相減可以得到乙個差分層,從而建立了差分金字塔。

6.     關鍵點:又稱極值點,即上述高斯-拉普拉斯函式極值點,在實際計算中,取差分金字塔上下和當前層周圍3*3*3區域內的畫素極值點。

亞畫素:由於是在離散空間進行取樣,因此點的位置不一定在畫素級別是精確的,因此需要進行亞畫素的插值,精確求解關鍵點的位置。dog函式在尺度空間的泰勒展開式為:

求偏導數,令偏導數兩邊為0:求得極值點為,其中為三方向偏移量,當大於0.5時則在原位置+偏移量組成的新位置上再次插值。在計算機中的實際計算方法為:

8.     邊緣效應與對比度:對比度較差的關鍵點不能作為特徵,設定了一對比度閾值。dog運算元具有很強的邊緣效應,即x與y向的海森矩陣特徵值()差距過大。

。其中=,,滿足《的關鍵點才能被留下。

9.     高斯尺度因子:尺度因子lowe建議初始化為0.6,每一層之間的尺度因子變換關係為:。組間尺度因子變換關係為:這說明不同組相同層的尺度因子是相同的,只有層內才會發生尺度因子變化。

10.  主方向:關鍵點周圍取乙個圓形的鄰域(半徑r由lowe建議),統計每乙個畫素的梯度,並且lowe建議將360°分為8個方向,每乙個範圍均為45°,將每個畫素對應梯度方向範圍內加上梯度幅值,最後幅值最大的直方圖柱稱為主方向。

11.  主方向梯度直方圖的高斯平滑:由於sift不具備仿射不變性,因此在特徵點移動中會出現由於平移導致的振盪問題(仿射與線性變換),對主方向進行平滑,在計算中為:。

12.  旋轉不變性:將畫素點的座標值按照主方向進行旋轉,,這樣主方向與座標軸相重合,這樣對影象的旋轉既可以轉換為對主方向的旋轉,從而轉換為對座標軸的旋轉,因此具有旋轉不變性。

13.  特徵點描述子:找到了關鍵點後對其進行描述,lowe建議在特徵點鄰域內選擇4*4的畫素區域,在每個區域內選擇8個方向。對每個取樣點進行亞畫素的雙線性插值來求解梯度值。(因為此時是乙個畫素內,則梯度無法直接通過兩個方向的畫素來求解,只能通過插值求解,這需要跟求主方向的梯度區別開)(問題1:為什麼會出現在畫素內的點? 因為在經過關鍵點亞畫素插值後,即產生了亞畫素位置)(問題2:為什麼求解主方向不用亞畫素位置?因為求主方向時所取鄰域較大,並且主方向反映巨集觀上的特徵點座標取向,因此利用畫素級的點求解更好)。求解了8個方向的梯度後,可以形成乙個4*4*8=128的特徵向量,稱為特徵描述子。

14.  特徵匹配:根據特徵描述子的相近程度來匹配。

sift特徵點檢測及描述步驟

1) 對影象進行降取樣,得到初期的o組高斯金字塔。(有時候會有-1組的出現,此時需要先將影象擴大一倍)

2) 對組內的一張進行高斯模糊,在每組內建立多層的影象,從而建立了o組多層的高斯金字塔

3) 對每一組內的相鄰層進行差分求解,建立差分金字塔,每組金字塔的層數為s,並且要多取兩層,為後來檢測極值點準備。差分金字塔o組s層,(s+2)張。

4) 檢測極值點,遍歷差分金字塔每組每層的畫素,找到畫素3*3*3鄰域內的極值點,作為關鍵點初始位置

5) 亞畫素插值求解關鍵點精確位置。

6) 對關鍵點進行去除,包括對比度與邊緣效應。

7) 差分金字塔各層尺度變換,尺度因子的關係。

8) 求解關鍵點的主方向,利用周圍鄰域的梯度來確定關鍵點的主方向。

9) 對主方向直方圖進行高斯平滑,來提高穩定性。

10)  先將關鍵點鄰域按其主方向進行旋轉,並以主方向為基準建立座標軸,確定鄰域各畫素的座標位置。

11)  選取關鍵點周圍4*4鄰域範圍,分別計算取樣點對各子域梯度的影響,根據亞畫素級雙線性插值方法統計每個子閾8個方向的梯度,從而建立了4*4*8的特徵向量,該向量即為描述子。

12)  歸一化描述子。

13)  利用建立好的描述子進行特徵匹配。

結合sift源**的補充

源**以opencv作為依賴庫函式,以自帶的結構體iplimage * 表示影象,**指標ipiimage *** 表示金字塔,cvseq *表示影象的特徵序列,double *表示梯度直方圖陣列。

1) 原始碼提到了塔的-1組,並且將圖的比例擴大一倍。

2) 在具體計算時,如梯度等均用差分代替偏導,或者中心差分代替二階導數。

3) 在產生新特徵點時,對序列陣列要預先分配空間,而且分為產生新特徵calloc,特徵點加入序列malloc,特徵點亞畫素位置new。

4) 在高斯模糊搜尋區域時,迴圈起點在高斯模板長度處開始(一般為5),保證了模板包含在整個畫素內部。

5) 在迴圈時要考慮點是否在畫素平面內,還有乙個重要的考慮是第n個點與第0個點的左右值問題,程式中是迴圈處理的,及n-1,0,1也看做是相鄰點。

總結

sift特徵點是lowe在2023年所提出的,至今仍有很好的應用,它利用差分金字塔近似高斯-拉普拉斯函式求解極值點保證了特徵點的尺度不變性,利用特徵點鄰域統計梯度直方圖確定主方向,並將座標軸旋轉至主方向保證了旋轉不變性,利用對特徵梯度直方圖的平滑近似部分仿射不變性。從而使特徵點在運動過程中較為穩定,為利用sift特徵點進行幀間的運動估計提供了基礎。

再讀HashMap原始碼

今天被問了hashmap的原始碼,雖然之前看過,但是時間一長,而且當時沒有做任何筆記,回答非常的模糊,所以決定回頭再讀一次。hashmap預設初始化大小為16 tatic final int default initial capacity 1 4 最大容量為2 30 static final in...

原始碼分析 HashMap原始碼再讀 基於Java8

最近工作不是太忙,準備再讀讀一些原始碼,想來想去,還是先從jdk的原始碼讀起吧,畢竟很久不去讀了,很多東西都生疏了。當然,還是先從炙手可熱的hashmap,每次讀都會有一些收穫。當然,jdk8對hashmap有一次優化 我們首先看到的,應該是它的一些基本引數,這對於我們了解hashmap有一定的作用...

Opencv2 4 9原始碼分析 SIFT

由於sift演算法在計算機視覺的特徵檢測和特徵描述中表現十分優異,因此該演算法一經提出,就引起了廣泛的關注。國內外對其研究的人很多,相關的資料也很多。在csdn中,有幾位作者的文章對sift演算法介紹得很詳細,如網名為 zddhub rachel zhang和xiaowei cqu。由王永明和王貴錦...