前面介紹了如何生成高斯圖像金字塔,并計算了每組圖像的高斯差分圖像。現在介紹如何進行關鍵點搜尋與定位(都在灰階圖上搞的)。
一、極值點計算
關鍵點是由DOG空間的局部極值點組成的。為了尋找DoG函數的極值點,每一個像素點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。

每一幅高斯差分圖像中的一個像素點,要和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確定在尺度空間和二維圖像空間都檢測到極值點。
具體算法:
(1) 周遊不同分辨率和尺度高斯差分金字塔,擷取特定分辨率和尺度下的高斯差分圖像Io,s
(2) 同組同層比較,對Io,s内的每個像素Pcenter,首先比較Pcenter與門檻值PRE_COLOR_THRES,若不滿足條件,則傳回false,即該點不是極值點,轉到(4);否則,将Pcenter與其周圍8鄰域像素點比較,隻要該鄰域記憶體在相對于Pcenter的最大和最小值像素點,則認為Pcenter是該層的極值點,傳回true,轉到(3)
(3) 同組不同層比較,在Io,s上下兩層高斯差分圖像Io,s-1和Io,s+1中,分别将Pcenter同其對應的上下層鄰域進行比較,如果在上下兩層鄰域内均存在相對于Pcenter的最大最小值,則認為Pcenter是相鄰層的極值點,傳回true,否則就不是極值點,傳回false,轉到(4)
(4) 對于傳回值為true的,将Pcenter加入極值點坐标集合ret中
代碼如下,清華小哥用到了c++的新特性,lamda函數,略高端:
有一個問題是到底要在多少個尺度中尋找極值點, 即如何确定 s 值(組内層數)。實驗表明, s 取 3 是較好的選擇。如果 s = 3,則需要 5 幅高斯差分圖像才可以。這裡的計算是高效的,因為大多數情況下,隻需要幾步比較,就可以排除一個像素點,認為它不是極值。
另外,在極值比較的過程中,每一組圖像的首末兩層是無法進行極值比較的,為了滿足尺度變化的連續性,我們在每一組圖像的頂層繼續用高斯模糊生成了3幅圖像,高斯金字塔有每組S+3層圖像。DOG金字塔每組有S+2層圖像。也就是說,我們隻犧牲了-1組的第0層和第N組的最高層。
二、抽取穩定的關鍵點
由于DoG值對噪聲和邊緣較敏感,是以,在上面DoG尺度空間中檢測到局部極值點還要經過進一步的檢驗才能精确定位為特征點。上一步已經求出了極值點,現在要對這些極值點進行篩選,去除不穩定的點,以增強特征點比對時的穩定性、提高抗噪聲能力。不穩定的點包括低對比度的點和邊緣上的點。同時,由于在金子塔中存在降采樣的圖像,在這些圖像中提取的極值點在原始輸入圖像中到底在什麼位置,也是一個問題。下面将提出上面兩個問題的解決方案。
1. 去除低對比度點
低對比度的極值點,是那些對噪聲敏感的候選點 ,需要剔除。周遊每個候選極值點sp,利用插值法重新計算坐标,并重複多次後,再将新坐标的像素與門檻值比較,決定去留。對于保留的極值點,更新其坐标,進入邊緣響應剔除步驟。
插值的計算采用對尺度空間DoG函數進行曲線拟合,DoG函數在尺度空間的Taylor展開式,即在某極值點A對D(x,y,σ)進行泰勒展開:
(1)
這裡X=(x,y, σ)是最終插值點到點A的偏移量,對上式求X的偏導數,并令之為零,求X
(2)
Sift原著作者認為如果,偏移量中任何一個分量大于0.5,則這個極值點和另一個采樣點(圖像中的另一個像素)離得更近,需要采用插值法求得極值點位置的估計值(即分量大于0.5,offset不可忽略~~),同時也可以将x待回原式求得D(x)與門檻值0.03比較去除低對比度點:
(3)
上面的式子中,二階導數用Hessian矩陣,一階導數用梯度,它們均通過相鄰像素的內插補點計算。這裡的Hessian矩陣是由三元函數的二階偏導數構成的方陣,描述了DOG函數的局部曲率:
(4)
具體算法流程:
周遊每個極值點,利用(4)式計算新的插值坐标偏移量iter_offset。若滿足OFFSET_THRES門檻值要求,則更新極值坐标,并将新坐标代入(3)式,求得的結果dextr與門檻值CONTRAST_THRES比較,若滿足要求,則更新極值點的真實坐标sp->real_coor
2. 去除邊緣響應點
由于DoG函數在圖像邊緣有較強的邊緣響應,而邊緣上的極值點抗噪性較差,是以我們還需要排除邊緣響應。
我們知道曲面上每個點(非平點)都有兩個主方向,并且沿這兩個主方向的法曲率(即兩個主曲率)分别是曲面在該點法曲率的最大值和最小值。對于邊緣上的點,沿垂直于邊緣的方向上,法曲率最大,而沿邊緣的方向上,法曲率最小。是以對于分布在邊緣上附近的極值點,它們的法曲率最大值和最小值之比(即兩個主曲率之比),一般情況下要比非邊緣點的比值大。根據這種思想,我們可以設一個比值的門檻值,當比值大于這個門檻值就認為極值點在邊緣上。
DOG函數主曲率可以通過計算在該點位置尺度的2×2的Hessian矩陣得到,導數由采樣點相鄰差來估計:
這裡Dxx表示DOG金字塔中某一尺度的圖像x方向求導兩次,微分可以通過計算鄰近點的內插補點來近似計算。
又因為DOG的主曲率和H的特征值成正比,我們隻需要計算 H 的較大特征值與較小特征值的比例即可。設α 是較大的特征值, β 是較小的特征值,由矩陣性質知:
其中用到了矩陣的迹和行列式。通常這裡的行列式不會是負值,如果出現負值的情況,即兩個主曲率不同号,我們将丢棄這個點,不将其視為極值點。設 r=α/ β ,我們可得:
這裡當 r≥1,(r+1)2/r是r的單調遞增函數,是以要計算主曲率的比值(即 r)是否在某門檻值之下,為了避免求H的特征值,隻需要判斷上式左邊的項是否在門檻值之下即可,通常r取10。
具體步驟:
對于每個候選特征點,計算其Hessian矩陣,然後計算該矩陣的迹和行列式的比值,如果該比值大于門檻值則保留該候選關鍵點,否則剔除。
極大值點結果(未去除低對比度和邊緣響應)
精确定位特征點處理效果:
注意這裡的特征點來自于不同分辨率的不同尺度的高斯差分圖像,下圖展示的是經過統一坐标大小後的結果。