SIFT算法是一種基於尺度空間的算法。利用SIFT提取出的特征點對旋轉、尺度變化、亮度變化具有不變性,對視角變化、仿射變換、噪聲也有一定的穩定性。
SIFT實現特征的匹配主要包括四個步驟:
- 提取特征點
- 計算關特征點的描述子
- 利用描述子的相似程度對特征點進行匹配
- 消除誤匹配點
1、 提取特征點
構建尺度空間:模擬圖像的多尺度特征。經證實,唯一可能的尺度空間核是高斯函數。用L(x,y,σ)表示一幅圖像的尺度空間,由可變尺度的高斯函數G(x,y,σ)和圖像卷積產生,即,其中
,(x,y)表示圖像上的點,σ是尺度因子。
高斯金字塔:
- 將圖像與不同σ的高斯函數做卷積
- 對圖像進行降采樣
第一階的第一層是原始圖像,同一階中相鄰兩層的尺度因子比例為k,其它層依次類推。
第二階第一層的尺度因子來自於第一階中間層的尺度因子。
DOG金字塔
Laplace算子:,具有旋轉不變性(證明參考)。
LOG算子:將Laplace算子與高斯函數相結合,
為了簡化LOG的計算,提出了DOG算子即高斯差分函數:
所以, 而
所以
根據上面可知,高斯差分算子只是比LOG算子多了一個系數(k-1),並不影響特征點的求解。
所以DOG函數如下:
DOG金字塔通過高斯金字塔相鄰尺度空間函數相減得到,第一層的尺度因子與高斯金字塔第一層的尺度因子一致。
檢測極值點,初步確定特征點
該步驟檢測DOG空間的最大最小值,需要對DOG尺度空間的每個像素點(除去最頂層最底層)與其周圍26個像素點(如下圖,同層相鄰8個,上一層9個,下一層9個)進行比較。若結果是該像素點比其周圍26個像素點值都大或都小,則初步判斷為局部極值點,記下其位置和尺度因子。若結果是該像素點比其周圍26個像素點值都大或都小,則初步判斷為局部極值點,記下其位置和尺度因子。
對上一步得到的特征點進行篩選,去除低對比度及邊緣的點。
精確定位極值點:
我們找的極值點屬於離散空間上的點,不一定是真正極值點,需要一條曲線進行擬合。
設A(x0,y0,σ0)為檢測到的極值點,B(x,y,σ)為真正的極值點,在A附近應用泰勒展開公式:
D對x求導,令其為0得:
帶入上式得:
若上式求出的中|Δx|或|Δy|或|Δσ|中有一個>0.5,表示該插值點偏離了插值中心,
令x=x+round(Δx)
y=y+round(Δy)
σ=σ+round(Δσ)
繼續插值直到達到最大迭代次數或|Δx|、|Δy|、|Δσ|均<0.5。
對得到的極值點B計算D(B)進行低對比度篩選。
消除邊緣效應:
目的是消除邊緣極值點。邊緣極值點滿足的條件是:一個方向上變化率非常小,另一個方向上變化率較大(如在黑板上畫一條水平線,則水平方向灰度值變化率非常小,垂直方向變化率大,且主曲率與黑塞矩陣的特征值成正比)。根據這一性質,求出黑塞矩陣,設H的特征值為λ1、λ2,其中較大的是λ1。令r=λ1/λ2,則邊緣極值點即是r比較大的點,設r閾值為thres,對所有的極值點判斷其r值是否大於thres,若大於則去除。
更簡單的方法是,利用進行篩選,其中λ1+λ1=tr(H),λ1λ2=|H|。
尋找特征點主方向:
對於任一像素點(x,y),
其梯度值:
梯度方向:
對於每個特征點,統計以其為中心的鄰域內的像素梯度方向,用直方圖表示統計結果,直方圖的峰值就是該特征點的主方向。
2、特征點描述子:
以特征點x為中心畫圓鄰域,將該鄰域划分成16個子區域。每為一個單位,那么總共有8個刻度,統計每個子區域內8個刻度值,如下圖:
則用16x8=128維矢量作為該特征點的描述子。
3、特征匹配:
分別提取圖像1、圖像2的特征點並計算描述子。對圖像1的每個特征點f,在圖像2中找到距離其最近的兩個特征點k1、k2,並計算f與k1、f與k2之間夾角θ1、θ2,
若,則為一對匹配點。
4、消除誤匹配點:使用RANSAC算法消除誤匹配點
- 隨機找到8個特征點對,使用八點法計算基礎矩陣F
- 用F驗算剩余特征點對,計算用F驗算成功的點對數n
- 重復一定次數,找到使n達到最大值的F,不滿足F的特征點對刪除。