SIFT算法:DoG尺度空間生產 |
SIFT算法:KeyPoint找尋、定位與優化 |
SIFT算法:確定特征點方向 |
SIFT算法:特征描述子 |
目錄:
1、找尋
2、定位
3、優化
1 KeyPoint找尋
極值的檢測是在DoG空間進行的,檢測是以前點為中心,3pixel*3pixel*3pixel的立方體為鄰域,判斷當前點是否為局部最大或最小。如下圖所示,橘黃色為當前檢測點,綠色點為其鄰域。因為要比較當前點的上下層圖像,所以極值檢測從DoG每層的第2幅圖像開始,終止於每層的倒數第2幅圖像(第1幅沒有下層,最后1幅沒有上層,無法比較)。
2 KeyPoint定位
以上極值點的搜索時在離散空間中進行的,檢測到的極值點並不是真正意義上的極值點。如下圖所示,連續空間中極值與離散空間的區別。通常通過插值的方式,利用離散的值來插值,求取接近真正的極值的點。
對於一維函數,利用泰勒級數,將其展開為二次函數:
f(x) ≈ f(0) + f'(0)x + f''(0)x2
對於二維函數,泰勒展開為:
矩陣表示為:
矢量表示為:
當矢量為n維時,有:
求取f(x)的極值,只需求取∂f/∂x = 0。對於極值,x,y,σ三個變量,即為三維空間。利用三維子像元插值,設其函數為D(x, y, σ),令x = (x, y, σ)T,那么在第一節中找到的極值點進行泰勒展開為(式-1)如下:
其中D為極值點的值,∂DT/∂x為在極值點各自變量的倒數,∂2D/∂x2為其在展開點相應的矩陣。對上式求導,另∂D(x)/∂x = 0,結果如下式,對應的(為了表示方便,ˆx代替
)向量即為真正極值點偏離插值點的量。求解得(式-2)如下:
最終極值點的位置即為插值點x+ˆx,且多次迭代可以提高精度(一般為5次迭代)。
問題 1:
《圖像局部不變性特征與描述》中提到,對於偏移量ˆx任何方向上偏移大於0.5的特征點,要刪除該點。
對於Lowe的原文為:If the offset ˆx is larger than 0.5 in any dimension, then it means that the extremum lies closer to a different sample point. In this case, the sample point is changed and the interpolation performed instead about that point.
本人英語水平有限,個人認為原作者並未說要刪除此類點,只是說這個點偏移了,所以需要插值來進行替換。且在OpenCV sift的源碼中,並未刪除上述類型的點,在vlfeat的開源代碼中,也未刪除上述點。
3 KeyPoint優化
對KeyPoint定位后,要剔除一些不好的KeyPoint,那什么是不好的KeyPoint的呢?
- DoG響應較低的點,即極值較小的點。
- 響應較強的點也不是穩定的特征點。DoG對圖像中的邊緣有較強的響應值,所以落在圖像邊緣的點也不是穩定的特征點。一方面圖像邊緣上的點是很難定位的,具有定位的歧義性;另一方面這樣的點很容易受到噪聲的干擾變得不穩定。
對於第一種,只需計算矯正后的點的響應值D(ˆx),響應值小於一定閾值,即認為該點效應較小,將其剔除。將(式-2)帶入(式-1),求解得:
在Lowe文章中,將|D(ˆx)|<0.03(圖像灰度歸一化為[0,1])的特征點剔除。
對於第二種,利用Hessian矩陣來剔除。一個平坦的DoG響應峰值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的地方有較小的主曲率。主曲率可以通過2×2的Hessian矩陣H求出:







參考資料:
- David G. Lowe Distinctive Image Features from Scale-Invariant Keypoints
- 王永明 王貴錦 《圖像局部不變性特征與描述》