特徵點檢測
1. Harris角點檢測
角點檢測的基本思想是:使用角點檢測算子,對圖像的每個像素計算角點響應函數(Corner Response Function ),閾值化角點響應函數,根據實際情況選擇閾值,對閾值化的角點響應函數進行非極大值抑制,並獲取非零點作爲角點。
角點響應函數定義爲:
E(u,v)=∑x∑yw(x,y)[I(x+u,y+v)−I(x,y)]2, w(x,y)代表窗函數
使用泰勒級數展開,並忽略非線性項:
I(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)≈I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy
進一步化簡爲:
E(u,v)=∑x,yw(IxΔx+IyΔy)2=[ΔxΔy]M⎣⎡ΔxΔy⎦⎤
其中:
where M=∑(x,y)w(x,y)(IX2IXIYIXIYIY2)=(∑WIX2∑WIXIY∑WIXIY∑WIY2)=[ACCB]
即圖像的角點響應函數近似爲二項函數:
c(x,y;Δx,Δy)≈AΔx2+2CΔxΔy+BΔy2
二項函數的本質是橢圓; 而特徵值代表橢圓的長軸和短軸:
爲了評價特徵值大小,他們定義了一個評價指標爲;
R=det(M)−k(trace(M))2
一般 k=0.04 0.06
det(M)=λ1λ2
trace(M)=λ1+λ2
其中
1)圖像中的直線,一個特徵值大,另一個特徵值小, 此時R<0
2)圖像中的平面,兩個特徵值都小,且近似相等,此時 R 很小
3)圖像中的角點,兩個特徵值都大,且近似相等, 此時 R 很大
- Harri角點對亮度和對比度變化不敏感
- Harris角點具有旋轉不變性
- Harris不具有尺度不變性
2.SIFT特徵點檢測
尺度空間理論: http://www.cnblogs.com/ronny/p/3886013.html
可以證明: 高斯核是實現尺度變換的唯一變換核。
SIFT算法的特點有:
- SIFT特徵是圖像的局部特徵,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;
- 獨特性(Distinctiveness)好,信息量豐富,適用於在海量特徵數據庫中進行快速、準確的匹配;
- 多量性,即使少數的幾個物體也可以產生大量的SIFT特徵向量;
- 高速性,經優化的SIFT匹配算法甚至可以達到實時的要求;
- 可擴展性,可以很方便的與其他形式的特徵向量進行聯合
SIFT算法步驟
-
尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯微分函數來識別潛在的對於尺度和旋轉不變的興趣點。
-
關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據於它們的穩定程度。
-
方向確定:基於圖像局部的梯度方向,分配給每個關鍵點位置一個或多個方向。所有後面的對圖像數據的操作都相對於關鍵點的方向、尺度和位置進行變換,從而提供對於這些變換的不變性。
-
關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。
構建尺度空間
尺度空間理論目的是模擬圖像的多尺度特徵,高斯核是實現尺度變換的唯一線性核,二維尺度空間定義爲;
L(x,y,σ)=G(x,y,σ)∗I(x,y)
G(x,y,σ)=2πσ21e−(x2+y2)/2σ2
σ是尺度座標,代表圖像平滑程度,大尺度對應圖像概貌(低分辨率),小尺度對應圖像細節特徵(高分辨率), 爲了在尺度空間有限檢測特徵點,提出了高斯差分尺度空間(DOG scale-space):
從圖中可以看出,構建尺度空間分爲兩步
- 對圖像進行不同程度的高斯模糊得到每一層的若干幅圖像
- 對上一層倒數第三幅圖像(爲了保持尺度空間的連續性)進行下采樣,得到下一層(octave)
在得到了尺度空間後,則要構建高斯差分金字塔:如下圖所示,首先將同一層不同尺度的圖像做差,得到DOG, 爲了檢測不同尺度下的極值點,中間檢測點需要和同一尺度下相鄰的8個點,同時和上下層的9*2=18個點作比較,如果是這26個點中最大或最小值,則初步認爲是一個極值點,從上面分析可知,要想在一層S個尺度下檢測特徵點,則需要S+2高斯差分金字塔,S+3尺度金字塔;
關鍵點定位
上述的過程得到的是離散形式下的極值點,並非真正意義上的極值點,因此需要將離散空間插值到連續空間得到極值點,該方法叫子像元插值方法:
假設我們前面檢測到的離散極值點的位置是:(x,y,σ),則連續情況下極值點的位置應該在(x,y,σ)附近,設連續情況下極值點的位置在(Δx,Δy,Δσ), 進行泰勒展開可得:
D(Δx,Δy,Δσ)=D(x,y,σ)+[x∂Dy∂Dσ∂D]⎣⎡ΔxΔyΔσ⎦⎤+21[ΔxΔyΔσ]⎣⎢⎡∂xL∂2D∂ydx∂2D∂σdx∂2D∂x∂y∂2D∂y2∂2D∂σ∂y∂2D∂xdσ∂2D∂ydσ∂2D∂σ2∂2D⎦⎥⎤⎣⎡ΔxΔyΔσ⎦⎤
寫成矢量形式:
D(X)=D+∂X∂DTX+21XT∂X2∂2DX
令上面式子一階導數爲零,則X^=−∂X2∂2D−1∂X∂D,
如果任一尺度的相對偏移量大於0.5,說明候選點更新到了新的位置,通過上式迭代得到穩定的候選點的精確位置和尺度,將其帶入公式求出D(X),如果絕對值低於閾值,將會被刪除。
如果想得到穩定的特徵點,還需要刪除邊緣效應
由於DoG對圖像的邊緣也有較大的響應值,因此需要刪除不穩定邊緣點,可以通過主曲率來剔除這些點。
圖像的主曲率可以由 2×2的Hessian矩陣H求得:
H(x,y)=[Dxx(x,y)Dxy(x,y)Dxy(x,y)Dyy(x,y)]
H的特徵值α和β分別代表兩個方向的主曲率(梯度值), 不妨假設α是其中較大的一個,令α=γβ對於邊緣點來說,他們一個方向梯度很大,另一個方向梯度很小,即r很大的點,需要剔除這些點。
易得:
Tr(H)=Dxx+Dyy=α+β
Det(H)=DxxDy−(Dxy)2=αβ,
則:
Det(H)Tr(H)2=αβ(α+β)2=γ(γ+1)2, 當特徵值相等,上式值最小,隨着γ增大,上式值也增大,所以要想檢查主曲率的比例小於某一閾值γ,只要檢查下式是否成立
Det(H)Tr(H)2<γ(γ+1)2,論文中取γ=10
關鍵點方向確定
爲了使特徵描述子具有旋轉不變性,需要根據圖像的局部梯度特徵分配一個基準方向,
梯度的模值和方向定義如下:
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)))
其中L所用的尺度爲各自關鍵點素在的尺度,這樣每個關鍵點有三個信息:位置,尺度,方向。
在實際計算時,我們在以關鍵點爲中心的鄰域窗口內採樣,並用直方圖統計鄰域像素的梯度方向。梯度直方圖的範圍是0~360度,其中每45度一個柱,總共8個柱, 或者每10度一個柱,總共36個柱。Lowe論文中還提到要使用高斯函數對直方圖進行平滑,減少突變的影響。直方圖的峯值則代表了該關鍵點處鄰域梯度的主方向,即作爲該關鍵點的方向。鄰域範圍可以根據3σ原則來確定。
關鍵點特徵描述子
- 將座標軸旋轉到關鍵點的方向,以確保旋轉不變性
- 計算keypoint周圍的16*16(鄰域的範圍根據尺度確定,這裏僅舉一個例子)的window中每一個像素的梯度,而且使用高斯下降函數降低遠離中心的權重。
- 在每一個4×4的小塊計算8個方向梯度直方圖,繪製梯度方向的累加值,即可形成16個種子點,則這樣對每一個feature形成一個4×4×8=128維特徵描述子。每一維表示的是每個格子的 scale/orientation
- 將這個向量進一步歸一化,就除去了光照的影響。
根據特徵描述子進行Match
生成了A B兩幅圖的描述子,就可以把兩幅圖中各個scale的描述子計算歐式距離,進行匹配。
具體來說,對於圖像A中的某個特徵點,首先根據歐氏距離會在圖像B中尋找兩個匹配點,如果最鄰近距離與次鄰近距離距離比率小於某個閾值才認爲是正確匹配,減少匹配點的數量,使結果更穩定。
作者建議ratio的取值原則如下:
ratio=0. 4 對於準確度要求高的匹配;
ratio=0. 6 對於匹配點數目要求比較多的匹配;
ratio=0. 5 一般情況下。
參考博客
Harris特徵點檢測
https://www.cnblogs.com/ronny/p/4009425.html
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html
sift特徵點檢測
https://blog.csdn.net/dcrmg/article/details/52561656
https://www.jianshu.com/p/03449c6b42c4
https://blog.csdn.net/zddblog/article/details/7521424
http://www.cnblogs.com/ronny/p/4028776.html#3962356