图像处理——SIFT算法
[SIFT算法原文(Distinctive Image Features from Scale-Invariant Keypoints)
SIFT算法(Scale-invariant feature transform),即尺度不變特征變換,由David Lowe提出,是一種基于局部興趣點的算法,因此不僅對圖片大小和旋轉不敏感,而且對光照、噪聲等的抗干擾能力也很好。
主要步驟
尺度空間極值探測(Scale-space extrema detection)
利用高斯差分函數對整個圖像進行搜索,識別潛在的對縮放和旋轉具有不變性的興趣點。
使用級聯濾波方法來識別候選位置,然后進一步探測關鍵點。在所有尺度中,用尺度空間連續函數探測圖像中具有尺度變換不變性的位置。一副圖像的尺度空間函數L(x,y,σ)L(x,y,\sigma)L(x,y,σ)由可變尺度的高斯函數G(x,y,σ)G(x,y,\sigma)G(x,y,σ)和輸入圖像I(x,y)I(x,y)I(x,y)的卷積生成,即:
L(x,y,σ)=G(x,y,σ)?I(x,y)L(x,y,\sigma)=G(x,y,\sigma)*I(x,y)L(x,y,σ)=G(x,y,σ)?I(x,y),其中,?*?指卷積操作,G(x,y,σ)=12πσ2?e?x2+y22σ2\displaystyle G(x,y,\sigma)=\frac{1}{2\pi\sigma^2}\cdot e^{-\frac{x^2+y^2}{2\sigma^2}}G(x,y,σ)=2πσ21??e?2σ2x2+y2?。用**高斯差分函數(DOG)**的尺度空間極值同圖像做卷積,來有效探測尺度空間中穩定點的位置,即D(x,y,σ)=(G(x,y,kσ)?G(x,y,σ))?I(x,y)=L(x,y,kσ)?L(x,y,σ)D(x,y,\sigma)=(G(x,y,k\sigma)-G(x,y,\sigma))*I(x,y)=L(x,y,k\sigma)-L(x,y,\sigma)D(x,y,σ)=(G(x,y,kσ)?G(x,y,σ))?I(x,y)=L(x,y,kσ)?L(x,y,σ),其中kkk為常系數乘子。
高斯函數有較好的性質方便運算:σ?▽2G=?G?σ≈G(x,y,kσ)?G(x,y,σ)kσ?σ\displaystyle\sigma\cdot\bigtriangledown^2G=\frac{\partial G}{\partial \sigma}\approx\frac{G(x,y,k\sigma)-G(x,y,\sigma)}{k\sigma-\sigma}σ?▽2G=?σ?G?≈kσ?σG(x,y,kσ)?G(x,y,σ)?,
而G(x,y,kσ)?G(x,y,σ)≈(k?1)?σ2?▽2GG(x,y,k\sigma)-G(x,y,\sigma)\approx(k-1)\cdot\sigma^2\cdot\bigtriangledown^2GG(x,y,kσ)?G(x,y,σ)≈(k?1)?σ2?▽2G。
完全探測出高斯差分函數的所有極值的代價是很昂貴的,但可以使用粗糙的大尺度采樣獲得最穩定和有效的子集。
名詞解釋:
尺度空間
即試圖子圖像領域中模擬人眼觀察物體的概念與方法。SIFT利用高斯函數進行濾波的主要原因:
(1)高斯核函數是唯一的尺度不變核函數;
(2)高斯差分函數可近似為兩個LLL之差,使得特征提取更簡單(具體描述如上所示)。
而圖像的尺度空間生成LLL是當前圖像與不同尺度的核參數σ\sigmaσ卷積后產生的圖像。
尺度空間的實現可以利用高斯金字塔表示,其構建分兩步:(1)對圖像做高斯平滑;(2)對圖像做降采樣。
將圖像金字塔每層的一張圖像使用不同參數σ\sigmaσ做高斯模糊,使得金字塔的每層含有多張高斯模糊圖像。金字塔的每層多張圖像合稱為一組(Octave),每層只有一組圖像,組數與金字塔層數相等。每組含有多張(稱為層(Interval))圖像。降采樣時,金字塔上一組圖像的初始圖像是有前一組圖像的倒數第三張圖像隔點采樣得到的。
若高斯金字塔共有o組,s層,則有σ(s)=σ0?2sS\sigma(s)=\sigma_0\cdot2^{\frac{s}{S}}σ(s)=σ0??2Ss?,其中σ\sigmaσ為尺度空間坐標,s為sub-level層坐標;σ0\sigma_0σ0?為初始尺度,S為每組的層數。
DOG局部極值檢測
特征點是由DOG空間的局部極值點組成。每一個像素點要和它的圖像域和尺度域的所有相鄰點進行比較。如圖所示,中間的檢測點要和它通尺度的8個相鄰點和上下相鄰尺度對應的2×\times× 9個點比較,以確保在尺度空間和圖像空間都檢測到極值點。
關鍵點定位(Keypoint localization)
通過擬合精細的模型在每個候選位置上確定位置和尺度,而關鍵點的選擇依賴于它們的穩定程度。
通過比較一個像素和它的相鄰點可以發現候選關鍵點,接下來是對附近數據執行位置、尺度和主曲率的詳細擬合,這些信息使得低對比度的點、對噪聲敏感的點以及邊緣處的差點被淘汰。使用空間尺度函數D(x,y,σ)D(x,y,\sigma)D(x,y,σ)的泰勒展開(以樣本點為原點,展開到二階):
D(x)=D+?DT?xx+12xT?2D?x2x\displaystyle D(\mathbf x)=D+\frac{\partial D^T}{\partial\mathbf x}\mathbf x+\frac{1}{2}\mathbf x^T\frac{\partial^2 D}{\partial\mathbf x^2}\mathbf xD(x)=D+?x?DT?x+21?xT?x2?2D?x。
使D(x)D(\mathbf x)D(x)的導數為0,可得極值點x^=??2D?x2?1??D?x\displaystyle\hat{\mathbf x}=-{\frac{\partial^2 D}{\partial\mathbf x^2}}^{-1}\cdot\frac{\partial D}{\partial\mathbf x}x^=??x2?2D??1??x?D?,極值D(x^)=D+12?DT?xx^\displaystyle D(\hat{\mathbf x})=D+\frac{1}{2}\frac{\partial D^T}{\partial\mathbf x}\hat{\mathbf x}D(x^)=D+21??x?DT?x^。
邊緣消除:高斯差分函數對于邊緣是很敏感的,但有些差的邊緣是不需要的,需要消除。主曲率可利用2×\times× 2的Hessian 矩陣H\displaystyle\mathbf HH計算,H\displaystyle\mathbf HH中的導數Dxx,Dxy,Dyx,DyyD_{xx},D_{xy},D_{yx},D_{yy}Dxx?,Dxy?,Dyx?,Dyy?可利用采樣點及其相鄰點的差分得到,且H\displaystyle\mathbf HH的特征值和DDD的主曲率是成正比的。
簡化運算:記H\displaystyle\mathbf HH的奇異值為α,β,且α>β,α=rβ\alpha,\beta,且\alpha>\beta,\alpha=r\betaα,β,且α>β,α=rβ,則有Tr(H)=Dxx+Dyy=α+β,Det(H)=DxxDyy?(Dxy)2=αβTr(\mathbf H)=D_{xx}+D_{yy}=\alpha+\beta,Det(\mathbf H)=D_{xx}D_{yy}-(D_{xy})^2=\alpha\betaTr(H)=Dxx?+Dyy?=α+β,Det(H)=Dxx?Dyy??(Dxy?)2=αβ,
則Tr(H)2Det(H)=(α+β)2αβ=(r+1)2r\displaystyle\frac{{Tr(\mathbf H)}^2}{Det(\mathbf H)}=\frac{(\alpha+\beta)^2}{\alpha\beta}=\frac{(r+1)^2}{r}Det(H)Tr(H)2?=αβ(α+β)2?=r(r+1)2?。
因此,檢測主曲率是否小于設定的閾值rrr,只需檢測Tr(H)2Det(H)<(r+1)2r=T\displaystyle\frac{{Tr(\mathbf H)}^2}{Det(\mathbf H)}<\frac{(r+1)^2}{r}=TDet(H)Tr(H)2?<r(r+1)2?=T即可,然后便可進行消除。(建議閾值T設置為1.2,小于時保留關鍵點,大于時剔除)
圖中,(a)為原圖,(b)為經過高斯差分函數后提取到的邊緣關鍵點及方向,(c),(d)為將閾值rrr設置為10后進邊緣消除后的結果。
方向匹配(Orientation assignment)
基于局部圖像的梯度方向,為每個關鍵點設置一個或多個方向,后續對圖像的所有操作都與方向、尺度和位置的相關變換有關,這些提供了變換的不變性。
關鍵點尺度是用來選擇尺度最接近的高斯平滑圖像LLL,所有的計算都是在同一尺度不變條件下進行的。對于每個采樣圖像L(x,y)L(x,y)L(x,y),利用像素差分法計算其梯度量級m(x,y)m(x,y)m(x,y)和方向θ(x,y)\theta(x,y)θ(x,y),即:
m(x,y)=(L(x+1,y)?L(x?1,y))2+(L(x,y+1)?L(x,y?1))2\displaystyle m(x,y)=\sqrt{(L(x+1,y)-L(x-1,y))^2+(L(x,y+1)-L(x,y-1))^2}m(x,y)=(L(x+1,y)?L(x?1,y))2+(L(x,y+1)?L(x,y?1))2?
θ(x,y)=tan?1[L(x,y+1)?L(x,y?1)L(x+1,y)?L(x?1,y)]\displaystyle \theta(x,y)={tan}^{-1}[\frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1,y)}]θ(x,y)=tan?1[L(x+1,y)?L(x?1,y)L(x,y+1)?L(x,y?1)?]。
利用關鍵點周圍區域采樣點的梯度方向生成方向直方圖,方向直方圖有36個覆蓋360度的柱子,其峰值與局部梯度的主方向相對應。首先探測到最高峰,然后對最高峰80%以上的峰也創建關鍵點及方向;因此,對于有多重相似量級的位置,可以在該相同位置和尺度創建具有多個方向的關鍵點。但只有15%的點會被設置多重方向,但他們對匹配的穩定性是很重要的,最后,得到一個擬合3個直方圖且每個峰值最接近的更準確峰位的插值拋物線。
關鍵點描述子(Keypoint descriptor)
在每個關鍵點周圍的選定區域計算局部圖像梯度,這些梯度被轉換為一種允許有較大的局部變形和光照變化的表示。計算局部圖像區域的描述子,使得他們對光照或者三維視角的變換局域不變性。利用合適的尺度在關鍵點周圍進行局部圖像強度采樣,使用歸一化的相關方法進行匹配。
通過計算關鍵點位置周圍區域的每個采樣點的梯度量級和方向,來生成關鍵點描述子。利用一個高斯窗設置權重(即上圖中的圓),然后這些樣本被累加到覆蓋4×\times× 4個子域的方向直方圖,箭頭的長度是附近區域該方向的梯度量級之和。上圖展現的是一個從8$\times$ 8的樣本集中計算出的2×\times× 2的描述子。
總結
以上是生活随笔為你收集整理的图像处理——SIFT算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010 教程:创建一个 WPF 应
- 下一篇: C++ virtual 析构函数