SIFT的全稱是Scale Invariant Feature Transform,尺度不變特徵變換,由加拿大教授David G.Lowe提出的。SIFT特徵對旋轉、尺度縮放、亮度變化等保持不變性,是一種很是穩定的局部特徵。算法
有4個主要步驟函數
在必定的範圍內,不管物體是大仍是小,人眼均可以分辨出來。然而計算機要有相同的能力卻不是那麼的容易,在未知的場景中,計算機視覺並不能提供物體的尺度大小,其中的一種方法是把物體不一樣尺度下的圖像都提供給機器,讓機器可以對物體在不一樣的尺度下有一個統一的認知。在創建統一認知的過程當中,要考慮的就是在圖像在不一樣的尺度下都存在的特徵點。優化
在早期圖像的多尺度一般使用圖像金字塔表示形式。圖像金字塔是同一圖像在不一樣的分辨率下獲得的一組結果,其生成過程通常包括兩個步驟:spa
對處理後的圖像進行降採樣(一般是水平、垂直方向的1/2)
降採樣後獲得一系列不斷尺寸縮小的圖像。顯然,一個傳統的金字塔中,每一層的圖像是其上一層圖像長、高的各一半。多分辨率的圖像金字塔雖然生成簡單,但其本質是降採樣,圖像的局部特徵則難以保持,也就是沒法保持特徵的尺度不變性。orm
咱們還能夠經過圖像的模糊程度來模擬人在距離物體由遠到近時物體在視網膜上成像過程,距離物體越近其尺寸越大圖像也越模糊,這就是高斯尺度空間,使用不一樣的參數模糊圖像(分辨率不變),是尺度空間的另外一種表現形式。
咱們知道圖像和高斯函數進行卷積運算可以對圖像進行模糊,使用不一樣的「高斯核」可獲得不一樣模糊程度的圖像。一副圖像其高斯尺度空間可由其和不一樣的高斯卷積獲得:
\[ L(x,y,\sigma) = G(x,y,\sigma) * I(x,y)\]
其中,\(G(x,y,\sigma)是高斯核函數。\)
\[ G(x,y,\sigma) = \frac{1}{2 \pi \sigma ^2} e ^ {\frac{x^2 +y^2}{2 \sigma^2}}\]
\(\sigma\)稱爲尺度空間因子,它是高斯正態分佈的標準差,反映了圖像被模糊的程度,其值越大圖像越模糊,對應的尺度也就越大。\(L(x,y,\sigma)\)表明着圖像的高斯尺度空間。
構建尺度空間的目的是爲了檢測出在不一樣的尺度下都存在的特徵點,而檢測特徵點較好的算子是\(\Delta^2G\)(高斯拉普拉斯,LoG),
\[\Delta ^2 = \frac{\partial ^2}{\partial x^2} + \frac{\partial ^2}{\partial y^2}\]
使用LoG雖然能較好的檢測到圖像中的特徵點,可是其運算量過大,一般可以使用DoG(差分高斯,Difference of Gaussina)來近似計算LoG[Marr and Hidreth]。
設\(k\)爲相鄰兩個高斯尺度空間的比例因子,則DoG的定義:
\[D(x,y,\sigma) = [G(x,y,k\sigma) - G(x,y,\sigma)] \ast I(x,y) \\ = L(x,y,k\sigma) - L(x,y,\sigma)\]
其中,\(L(x,y,\sigma)\)是圖像的高斯尺度空間。
從上式能夠知道,將相鄰的兩個高斯空間的圖像相減就獲得了DoG的響應圖像。爲了獲得DoG圖像,先要構建高斯尺度空間,而高斯的尺度空間能夠在圖像金字塔降採樣的基礎上加上高斯濾波獲得,也就是對圖像金字塔的每層圖像使用不一樣的參數\(\sigma\)進行高斯模糊,使每層金字塔有多張高斯模糊過的圖像。降採樣時,金字塔上邊一組圖像的第一張是由其下面一組圖像倒數第三張降採樣獲得。
易知,高斯金字塔有多組,每組又有多層。一組中的多個層之間的尺度是不同的(也就是使用的高斯參數\(\sigma\)是不一樣的),相鄰兩層之間的尺度相差一個比例因子\(k\)。若是每組有\(S\)層,則\(k = 2 ^{\frac{1}{S}}\)。上一組圖像的最底層圖像是由下一組中尺度爲\(2\sigma\)的圖像進行因子爲2的降採樣獲得的(高斯金字塔先從底層創建)。高斯金字塔構建完成後,將相鄰的高斯金字塔相減就獲得了DoG金字塔。
高斯金字塔的組數通常是
\[o = [\log _2min(m,n)] - a\]
\(o\)表示高斯金字塔的層數,m,n分別是圖像的行和列。減去的係數\(a\)能夠在\(0-\log_2min(m,n)\)之間的任意值,和具體須要的金字塔的頂層圖像的大小有關。
高斯模糊參數\(\sigma\)(尺度空間),可由下面關係式獲得
\[\sigma(o,s) = \sigma_0 \cdot 2^{\frac{o + s}{S}}\]
其中\(o\)爲所在的組,\(s\)爲所在的層,\(\sigma_0\)爲初始的尺度,\(S\)爲每組的層數。
在Lowe的算法實現中\(\sigma_0=1.6,o_{min} = -1,S=3\),\(o_{min}=-1\)就是首先將原圖像的長和寬各擴展一倍。
從上面能夠得知同一組內相鄰層的圖像尺度關係
\[\sigma_{s+1}=k\cdot\sigma_s=2^{\frac{1}{S}}\cdot\sigma_s\]
相鄰組之間的尺度關係
\[\sigma_{o+1} = 2\sigma_o\]圖片
構建第o組,第s層 \(I_o \ast G(x,y,2^ok^s\sigma_0)\)圖像處理
高斯金字塔構建成功後,將每一組相鄰的兩層相減就能夠獲得DoG金字塔.ast
爲了尋找尺度空間的極值點,每一個像素點要和其圖像域(同一尺度空間)和尺度域(相鄰的尺度空間)的全部相鄰點進行比較,當其大於(或者小於)全部相鄰點時,改點就是極值點。如圖所示,中間的檢測點要和其所在圖像的\(3 \times 3\)鄰域8個像素點,以及其相鄰的上下兩層的\(3 \times 3\)領域18個像素點,共26個像素點進行比較。
從上面的描述中能夠知道,每組圖像的第一層和最後一層是沒法進行比較取得極值的。爲了知足尺度變換的連續性,在每一組圖像的頂層繼續使用高斯模糊生成3幅圖像,高斯金字塔每組有\(S+3\)層圖像,DoG金字塔的每組有\(S+2\)組圖像。
form
設\(S=3\),也就是每組有3層,則\(k = 2 ^ {\frac{1}{S}} = 2 ^ {\frac{1}{3}}\),也就是有高斯金字塔每組有\((S-1)3層圖像,DoG金字塔每組有\)(S-2)2層圖像。在DoG金字塔的第一組有兩層尺度分別是\(\sigma,k\sigma\),第二組有兩層的尺度分別是\(2\sigma,2k\sigma\),因爲只有兩項是沒法比較取得極值的(只有左右兩邊都有值纔能有極值)。因爲沒法比較取得極值,那麼咱們就須要繼續對每組的圖像進行高斯模糊,使得尺度造成\(\sigma,k\sigma,k^2\sigma,k^3\sigma,k^4\sigma\),這樣就能夠選擇中間的三項\(k\sigma,k^2\sigma,k^3\sigma\)。對應的下一組由上一組降採樣獲得的三項是\(2k\sigma,2k^2\sigma,2k^3\sigma\),其首項\(2k\sigma = 2\cdot2^{\frac{1}{3}}\sigma=2^{\frac{4}{3}}\sigma\),恰好與上一組的最後一項\(k^3\sigma = 2^{\frac{3}{3}}\sigma\)的尺度連續起來。
class
經過比較檢測獲得的DoG的局部極值點實在離散的空間搜索獲得的,因爲離散空間是對連續空間採樣獲得的結果,所以在離散空間找到的極值點不必定是真正意義上的極值點,所以要設法將不知足條件的點剔除掉。能夠經過尺度空間DoG函數進行曲線擬合尋找極值點,這一步的本質是去掉DoG局部曲率很是不對稱的點。
要剔除掉的不符合要求的點主要有兩種:
不穩定的邊緣響應點
候選特徵點x,其偏移量定義爲\(\Delta x\),其對比度爲\(D(x)\)的絕對值\(\mid D(x) \mid\),對\(D(x)\)應用泰勒展開式
\[D(x) = D + \frac{\partial D^T}{\partial x}\Delta x+ \frac{1}{2}\Delta x^T\frac{\partial ^2D}{\partial x^2}\Delta x\]
因爲x是D(x)的極值點,因此對上式求導並令其爲0,獲得
\[\Delta x = -\frac{\partial^2D^{-1}}{\partial x^2}\frac{\partial D(x)}{\partial x}\]
而後再把求得的\(\Delta x\)代入到D(x)的泰勒展開式中
\[D(\hat{x}) = D +\frac{1}{2}\frac{\partial D^T}{\partial x}\hat{x}\]
設對比度的閾值爲T,若\(\mid D(\hat{x})\mid \ge T\),則該特徵點保留,不然剔除掉。
在邊緣梯度的方向上主曲率值比較大,而沿着邊緣方向則主曲率值較小。候選特徵點的DoG函數D(x)的主曲率與\(2 \times 2\)Hessian矩陣\(H\)的特徵值成正比。
\[ H = \left[ \begin{array}{cc} D_{xx} \quad D_{yx} \\ D_{xy} \quad D_{yy} \end{array} \right]\]
其中,\(D_{xx},D_{xy},D_{yy}\)是候選點鄰域對應位置的差分求得的。
爲了不求具體的值,可使用\(H\)特徵值得比例。設\(\alpha = \lambda_{max}\)爲H的最大特徵值,\(\beta = \lambda_{min}\)爲H的最小特徵值,則
\[ Tr(H) = D_{xx} + D_{yy} = \alpha +\beta \\ Det(H) = D_{xx} + D_{yy} - D_{xy}^2 = \alpha \cdot \beta \]
其中,\(Tr(H)\)爲矩陣H的跡,\(Det(H)\)爲矩陣H的行列式。
設\(\gamma = \frac{\alpha}{\beta}\) 表示最大特徵值和最小特徵值的比值,則
\[ \frac{Tr(H)^2}{Det(H)} = \frac{(\alpha +\beta)^2}{\alpha \beta} = \frac{(\gamma \beta + \beta)^2}{\gamma \beta ^2} = \frac{(\gamma +1)^2}{\gamma} \]
上式的結果與兩個特徵值的比例有關,和具體的大小無關,當兩個特徵值想等時其值最小,而且隨着\(\gamma\)的增大而增大。所以爲了檢測主曲率是否在某個閾值\(T_{\gamma}\)下,只需檢測
\[\frac{Tr(H)^2}{Det(H)} > \frac{(T_{\gamma} + 1)^2}{T_{\gamma}}\]
若是上式成立,則剔除該特徵點,不然保留。(Lowe論文中取\(T_{\gamma} = 10\))
通過上面的步驟已經找到了在不一樣尺度下都存在的特徵點,爲了實現圖像旋轉不變性,須要給特徵點的方向進行賦值。利用特徵點鄰域像素的梯度分佈特性來肯定其方向參數,再利用圖像的梯度直方圖求取關鍵點局部結構的穩定方向。
找到了特徵點,也就能夠獲得該特徵點的尺度\(\sigma\),也就能夠獲得特徵點所在的尺度圖像
\[ L(x,y) = G(x,y,\sigma) \ast I(x,y) \]
計算以特徵點爲中心、以\(3 \times 1.5 \sigma\)爲半徑的區域圖像的幅角和幅值,每一個點L(x,y)的梯度的模\(m(x,y)\)以及方向\(\theta(x,y)\)可經過下面公司求得
\[ m(x,y) = \sqrt{[L(x+1,y) - L(x-1,y)]^2 + [L(x,y + 1) - L(x,y - 1)]^2} \\ \]
\[ \theta(x,y) = \arctan{\frac{L(x,y+1) - L(x,y - 1)}{L(x + 1,y) - L(x-1,y)}} \]
計算獲得梯度方向後,就要使用直方圖統計特徵點鄰域內像素對應的梯度方向和幅值。梯度方向的直方圖的橫軸是梯度方向的角度(梯度方向的範圍是0到360度,直方圖每36度一個柱共10個柱,或者沒45度一個柱共8個柱),縱軸是梯度方向對應梯度幅值的累加,在直方圖的峯值就是特徵點的主方向。在Lowe的論文還提到了使用高斯函數對直方圖進行平滑以加強特徵點近的鄰域點對關鍵點方向的做用,並減小突變的影響。爲了獲得更精確的方向,一般還能夠對離散的梯度直方圖進行插值擬合。具體而言,關鍵點的方向能夠由和主峯值最近的三個柱值經過拋物線插值獲得。在梯度直方圖中,當存在一個至關於主峯值80%能量的柱值時,則能夠將這個方向認爲是該特徵點輔助方向。因此,一個特徵點可能檢測到多個方向(也能夠理解爲,一個特徵點可能產生多個座標、尺度相同,可是方向不一樣的特徵點)。Lowe在論文中指出
15%的關鍵點具備多方向,並且這些點對匹配的穩定性很關鍵。
獲得特徵點的主方向後,對於每一個特徵點能夠獲得三個信息\((x,y,\sigma,\theta)\),即位置、尺度和方向。由此能夠肯定一個SIFT特徵區域,一個SIFT特徵區域由三個值表示,中心表示特徵點位置,半徑表示關鍵點的尺度,箭頭表示主方向。具備多個方向的關鍵點能夠被複製成多份,而後將方向值分別賦給複製後的特徵點,一個特徵點就產生了多個座標、尺度相等,可是方向不一樣的特徵點。
經過以上的步驟已經找到了SIFT特徵點位置、尺度和方向信息,下面就須要使用一組向量來描述關鍵點也就是生成特徵點描述子,這個描述符不僅包含特徵點,也含有特徵點周圍對其有貢獻的像素點。描述子應具備較高的獨立性,以保證匹配率。
特徵描述符的生成大體有三個步驟:
爲了保證特徵矢量的旋轉不變性,要以特徵點爲中心,在附近鄰域內將座標軸旋轉\(\theta\)(特徵點的主方向)角度,即將座標軸旋轉爲特徵點的主方向。旋轉後鄰域內像素的新座標爲:
\[\left[ \begin{array}{c} x ^ \prime \\ y ^ \prime \end{array} \right] = \left[ \begin{array}{cc} \cos \theta \quad - \sin \theta \\ \sin \theta \quad \cos \theta \end{array} \right] \left[ \begin{array}{c} x \\ y \end{array}\right] \]
旋轉後以主方向爲中心取 \(8 \times 8\)的窗口。下圖所示,左圖的中央爲當前關鍵點的位置,每一個小格表明爲關鍵點鄰域所在尺度空間的一個像素,求取每一個像素的梯度幅值與梯度方向,箭頭方向表明該像素的梯度方向,長度表明梯度幅值,而後利用高斯窗口對其進行加權運算。最後在每一個\(4 \times 4\)的小塊上繪製8個方向的梯度直方圖,計算每一個梯度方向的累加值,便可造成一個種子點,如右圖所示。每一個特徵點由4個種子點組成,每一個種子點有8個方向的向量信息。這種鄰域方向性信息聯合加強了算法的抗噪聲能力,同時對於含有定位偏差的特徵匹配也提供了比較理性的容錯性。
與求主方向不一樣,此時每一個種子區域的梯度直方圖在0-360之間劃分爲8個方向區間,每一個區間爲45度,即每一個種子點有8個方向的梯度強度信息。
在實際的計算過程當中,爲了加強匹配的穩健性,Lowe建議
對每一個關鍵點使用$ 4 \times 4$共16個種子點來描述,這樣一個關鍵點就能夠產生128維的SIFT特徵向量。
經過對特徵點周圍的像素進行分塊,計算塊內梯度直方圖,生成具備獨特性的向量,這個向量是該區域圖像信息的一種抽象,具備惟一性。
SIFT特徵以其對旋轉、尺度縮放、亮度等保持不變性,是一種很是穩定的局部特徵,在圖像處理和計算機視覺領域有着很重要的做用,其自己也是很是複雜的,下面對其計算過程作一個粗略總結。