SIFT算法详解
大綱
- 引言
- 一、高斯金字塔
- 二、高斯差分金字塔
- 三、特征點處理
- 1.閾值化
- 2.非極大值抑制
- 3. 二階泰勒修正
- 4.低對比度去除
- 5.邊緣效應去除
- 四、特征點描述子
- 1. 確定特征點區域方向
- 2. 特征點區域描述子
- 總結
- 參考:
引言
?SIFT算法是為了解決圖片的匹配問題,想要從圖像中提取一種對圖像的大小和旋轉變化保持魯棒的特征,從而實現匹配。這一算法的靈感也十分的直觀:人眼觀測兩張圖片是否匹配時會注意到其中的典型區域(特征點部分),如果我們能夠實現這一特征點區域提取過程,再對所提取到的區域進行描述就可以實現特征匹配了。于是問題就演變成了以下幾個子問題:
以上幾個問題在SIFT算法里都用了很有意思的trick,后續會一一介紹。
一、高斯金字塔
?引入高斯金字塔的目的在引言中已經介紹過了–解決圖片縮放及尺度變化下特征提取的問題,高斯金字塔的Intuition有兩個:1. 人看物體時近大遠小,可以對圖片下采樣實現(金字塔->組);2. 人看物體時近處清晰,遠處模糊,可以對圖像高斯平滑實現(高斯->層);具體的推導可以參見我的另一篇博客:
Opencv學習筆記(六)圖像金字塔
在SIFT里,高斯金字塔的層數和組數有著如下設定:
組數:O=[log2min(M,N)]?3O=[log_2min(M,N)]-3O=[log2?min(M,N)]?3
層數:S=n+3S=n+3S=n+3
?組數的設定是來自于提出SIFT算法的原始論文給出的經驗值,理論上來說知要O≤[log2min(M,N)]O\leq[log_2min(M,N)]O≤[log2?min(M,N)]即可,層數的設定則是有著理論依據的,這里的nnn是我們想要提取特征點的圖片層數,由于提取出高斯金字塔后需要計算層間差分以獲得高斯差分金字塔(DOG, Difference of Gausssian),高斯金字塔層數需要比DOG層數多1,而計算特征值時要求在尺度層面,即上下相鄰層間計算,則DOG層數要比特征層數多2,則要求S=n+3S=n+3S=n+3。
附:在SIFT中對于高斯金字塔有幾個需要補充的知識點。
二、高斯差分金字塔
?通過高斯金字塔,我們獲取了不同尺度的圖片,接下來的問題是如何獲取高頻區域呢,一個很簡單的思路就是按照邊緣檢測的算法使用差分濾波器如拉普拉斯濾波器、sobel濾波器在圖片上滑動找到灰度值變化劇烈的區域。而經前人研究,歸一化的高斯拉普拉斯算子的極大值極小值相較于其他特征提取函數可以獲得最穩定的圖像特征,因此我們打算使用歸一化的高斯拉普拉斯算子在多尺度圖片上提取特征,但是使用這種方式提取復雜度會很高,又尺度歸一化高斯拉普拉斯算子和DOG函數有著如下關系:
G(x,y,kσ)?G(x,y,σ)≈(k?1)σ2?2GG(x,y,k\sigma)-G(x,y,\sigma)\approx(k-1)\sigma^2 \nabla^2 GG(x,y,kσ)?G(x,y,σ)≈(k?1)σ2?2G
證明如下:
忽略高斯函數系數:
G(x,y,σ)=1σ2exp(?x2+y22σ2)?G?x=?xσ4exp(?x2+y22σ2)?2G?x2=?σ2+x2σ6exp(?x2+y22σ2)?2G(x,y)=?2G?x2+?2G?y2=?2σ2+x2+y2σ6exp(?x2+y22σ2)?G?σ=?2σ2+x2+y2σ5exp(?x2+y22σ2)?σ?2G=?G?σ\begin{aligned} &G(x,y,\sigma)=\frac{1}{\sigma^2}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\frac{\partial{G}}{\partial x}=-\frac{x}{\sigma^4}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\frac{\partial^2{G}}{\partial x^2}=\frac{-\sigma^2+x^2}{\sigma^6}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\nabla^2 G(x,y)=\frac{\partial^2{G}}{\partial x^2}+\frac{\partial^2{G}}{\partial y^2}\\ &\qquad \qquad \ =\frac{-2\sigma^2+x^2+y^2}{\sigma^6}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\frac{\partial{G}}{\partial \sigma}=\frac{-2\sigma^2+x^2+y^2}{\sigma^5}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\Rightarrow\\ &\sigma\nabla^2G=\frac{\partial G}{\partial \sigma} \end{aligned}?G(x,y,σ)=σ21?exp(?2σ2x2+y2?)?x?G?=?σ4x?exp(?2σ2x2+y2?)?x2?2G?=σ6?σ2+x2?exp(?2σ2x2+y2?)?2G(x,y)=?x2?2G?+?y2?2G??=σ6?2σ2+x2+y2?exp(?2σ2x2+y2?)?σ?G?=σ5?2σ2+x2+y2?exp(?2σ2x2+y2?)?σ?2G=?σ?G??
又對于差分高斯金字塔有:
DOG=G(x,y,kσ)?G(x,y,σ)(k?1)σ≈?G?σDOG≈(k?1)σ2?2G\begin{aligned} &DOG=\frac{G(x,y,k\sigma)-G(x,y,\sigma)}{(k-1)\sigma}\approx \frac{\partial G}{\partial \sigma}\\ & DOG \approx(k-1)\sigma^2\nabla^2G \end {aligned}?DOG=(k?1)σG(x,y,kσ)?G(x,y,σ)?≈?σ?G?DOG≈(k?1)σ2?2G?
由此我們不再需要在高斯金子塔上進行卷積操作,只需要計算在尺度層面σ\sigmaσ進行層間差分得到高斯差分金字塔(DOG),即完成了特征提取的操作。
三、特征點處理
?得到DOG后,我們理論上來說就已經獲得了特征值,但我們需要對特征值進行一些處理,就像我們在cannny邊緣檢測中使用的非極大值抑制等思路,去掉沒那么特征的特征值。
1.閾值化
?簡單的閾值化去除掉變換沒有那么劇烈的點,這些點就有可能是噪聲引起的,算是在高斯拉普拉斯之外又加了一層去噪措施。
val={valabs(val)>0.5Tn0otherwiseval=\begin{cases} val & abs(val)>0.5\frac{T}{n}\\ 0 & otherwise \end{cases}val={val0?abs(val)>0.5nT?otherwise?
這里的TTT為經驗值0.04,nnn為之前提過的提取特征點數目。
2.非極大值抑制
?非極大值一致的思路就和在其他算法中的一樣,我們要求選取出的特征值應該是其領域范圍內的極值,不同之處在于其他算法要求的只是圖像這一二維平面內的極值,而這里要求還要在尺度σ\sigmaσ這一層面上也是極值,這也承接了前文DOG層數要比提取特征所用層數多2的設定。
3. 二階泰勒修正
?由于我們的圖片在x,y,σx,y,\sigmax,y,σ方向上都只能取到離散值,即使通過前兩個步驟取到了一些特征點,但這些特征點都不夠精確,我們需要引入二階泰勒函數對齊進行修正,使得特征點可以出現在亞像素(亞尺度)位置。
f(X)=f(X0)+?fT?XX^+12XT^?2f?X2X^f(X)=f(X_0)+\frac{\partial f^T}{\partial X}\hat{X}+\frac{1}{2}\hat{X^T}\frac{\partial^2 f}{\partial X^2}\hat{X}f(X)=f(X0?)+?X?fT?X^+21?XT^?X2?2f?X^
上式給出了特征點X0X_0X0?附近函數的近似值f(x)f(x)f(x),其中X^=X?X0\hat{X}=X-X_0X^=X?X0?,對該式求取一階導數零點,即可得函數實際極值點位置與X0X_0X0?的距離,從而對離散特征點修正到亞尺度處。
f′(X)=?fT?X+?f2?X2X^f'(X)=\frac{\partial f^T}{\partial X}+\frac{\partial f^2}{\partial X^2}\hat{X}f′(X)=?X?fT?+?X2?f2?X^
X^ex=??2f?1?X2?f?X\hat{X}_{ex}=-\frac{\partial^2 f^{-1}}{\partial X^2}\frac{\partial f}{\partial X}X^ex?=??X2?2f?1??X?f?
帶入前式可求取新的特征點的灰度值:
f(X′)=f(X0)+12?fT?X′X^exf(X')=f(X_0)+\frac{1}{2}\frac{\partial f^T}{\partial X'}\hat{X}_{ex}f(X′)=f(X0?)+21??X′?fT?X^ex?
需要注意的是,上式是一個不斷迭代的過程,也即根據當前特征點二階泰勒求取新的特征點這一過程會不斷重復直到滿足終止條件,如X^\hat{X}X^過小。另需注意當所得解超出離散極值點一定范圍時需要舍去,因為二階泰勒擬合只在其附近有效。
附:一個挺有意思的點在于這里的迭代目的和梯度下降法里的迭代并不是同一個目的,梯度下降里我們求取的是函數在某點的梯度,因為我們很難對復雜非線性的神經網絡求除其一階導數零點,即使求取到了也可能落入局部極值;而這里我們是直接求到了函數的一階零點,迭代的目的是因為函數本身是一種近似,泰勒展開只取到了第二項,需要不斷對原函數進行近似。這兩種迭代的目的并不相同。
4.低對比度去除
?目的和之間的閾值化類似,同樣是去除掉沒那么劇烈變化的特征點。要求:
∣f(x)∣≥Tn|f(x)|\geq\frac{T}{n}∣f(x)∣≥nT?
5.邊緣效應去除
?引言中提過我們想要提取的特征點為角點而非邊緣,而前述一系列措施只能保證取到灰度值變換劇烈的點,而邊緣點同樣符合這一特征,因此我們將通過以下方式去除邊緣點。
- 計算黑森矩陣H(x,y)=[Dxx(x,y)Dxy(x,y)Dyx(x,y)Dyy(x,y)]H(x,y)=\begin{bmatrix} D_{xx}(x,y)&D_{xy}(x,y)\\ D_{yx}(x,y)&D_{yy}(x,y) \end{bmatrix}H(x,y)=[Dxx?(x,y)Dyx?(x,y)?Dxy?(x,y)Dyy?(x,y)?]
- 若矩陣行列式Det(H)<0Det(H)<0Det(H)<0,舍去該特征點
- 若矩陣行列式和跡不滿足:Tr(H)Det(H)<(γ0+1)2γ0\frac{Tr(H)}{Det(H)}<\frac{(\gamma_0+1)^2}{\gamma_0}Det(H)Tr(H)?<γ0?(γ0?+1)2?,舍去該特征點,γ0\gamma_0γ0?為有實際意義的經驗值,通常設定為10。
接下來解釋以下這幾個步驟的意義,角點和邊緣點的區別在于邊緣在圖像中表現為一條線,垂直于線的方向頻率高,沿著線的方向頻率比較低;而角點則在多(大于2)個方向方向出現強高頻分量。黑森矩陣實際上是函數的二階偏導構成的矩陣,可以反應函數的曲率變化狀況。又對于二次型矩陣有如下性質:
由性質1,2我們可以推導處當Det(H)<0Det(H)<0Det(H)<0時,特征點為非極值點,舍去;
由性質1,3我們可以推導出當Tr(H)Det(H)=(α+β)2α2β2\frac{Tr(H)}{Det(H)}=\frac{(\alpha+\beta)^2}{\alpha^2\beta^2}Det(H)Tr(H)?=α2β2(α+β)2?過小時,由兩特征特征向量的比值γ\gammaγ構成的式子(γ+1)2γ\frac{(\gamma+1)^2}{\gamma}γ(γ+1)2?同樣較小,且對勾函數在γ>1\gamma>1γ>1時單增,我們可以根據Tr(H)Det(H)\frac{Tr(H)}{Det(H)}Det(H)Tr(H)?大小判斷特征向量的相對大小,該值過小,說明函數在該點不同方向上的變化非常不均勻,類似于邊緣,舍去。
四、特征點描述子
?通過前述步驟,我們已經獲得了不同尺寸層面上的穩定特征點,接下來需要對其進行描述。
1. 確定特征點區域方向
?引言中提到為了使特征點擁有旋轉不變性,我們會將特征點區域統一旋轉到特定方向,這一方向即為特征點區域的主方向,因此我們需要先確定主方向。
計算方式為:統計在離該特征點尺度σ?\sigma^*σ?最近的尺度層σoct上,\sigma_{oct}上,σoct?上,以特征點為中心3σ′=3?1.5σoct3\sigma'=3*1.5\sigma_{oct}3σ′=3?1.5σoct?范圍內的像素的梯度幅值及方向,對于范圍內的梯度幅值用1.5σ?1.5\sigma^*1.5σ?高斯核濾波以實現距離加權。得到一系列梯度幅值和方向對pairs={amp,ang}pairs=\{amp,ang\}pairs={amp,ang}后,將360°360°360°方向劃分為多個bins,將包含相應angangang的pairspairspairs中的ampampamp值累加到對應的bins上,如果angangang在兩個bins劃分間則根據距離分配ampampamp。(此處和HOG算法類似,可自行查閱)。最終可以獲得特征點區域內幅值-方向直方圖,選取其中幅值最大的方向作為主方向。
附:這里的幾個參數像是統計區域的半徑,高斯加權的方差,有著不同的設置方式,但內在思路是一致的。此外如果在主方向之外出現了幅值達到了主方向幅值80%的其他方向,我們會將其作為輔方向,后續匹配時會出現兩個位置、尺度相同但方向不同的兩個特征點區域。
2. 特征點區域描述子
?獲得了特征點區域的主方向之后,我們就可以利用該值計算出有旋轉不變性的描述子了。首先還是和前一步類似,統計該特征點所在尺度層面一定區域內的梯度幅值和方向,實施起來略有不同。
r=32σoct(d+1)2r=\frac{3\sqrt{2}\sigma_{oct}(d+1)}{2}r=232?σoct?(d+1)?,其中ddd為我們在一個維度上劃分的子塊數目,通常為4;
附:需要注意的是以上的計算都是發生在相應的高斯金字塔尺度層面上,而非原圖或者DOG上,此外由于旋轉產生的像素值丟失通過插值算法解決,可以自行了解。如果想在原圖上可視化SIFT特征,需要將我們獲得的穩定特征點坐標變換回原始的圖像尺寸上,簡單的乘以原下采樣倍數即可。
總結
?至此SIFT算法就講解完畢了,匹配的部分根據提的特征采用其他的聚類算法即可,總的來說這個算法還是有一定難度,本文也只是針對其他博客沒有提到的細節引入了數學推導,使得整個思考過程更加連貫,更加詳細的數學證明如有限差分法還請移步參考。
參考:
SIFT原理部分:
SIFT算法詳解
SIFT算法原理詳解
SIFT算法
SIFT(尺度不變特征變換)
LOG和DOG關系部分:
LOG算子
黑森矩陣意義部分:
Hessian矩陣以及在圖像中的應用
Hessian 矩陣的特征值有什么含義?
Hessian矩陣與多元函數極值
Hessian矩陣(黑塞矩陣)
為何矩陣特征值乘積等于矩陣行列式值?
高斯相乘部分:
兩個高斯函數的卷積仍為一高斯函數
總結
- 上一篇: python查询斐波那契数列通项公式_分
- 下一篇: mxm智能教育机器人无法智能对话_关于智