DOG尺度空間構造
構造高斯金字塔尺度空間
https://blog.csdn.net/jinzhichaoshuiping/article/details/52971056
構造差分高斯金字塔
關鍵點搜索與定位
上一步中得到了高斯差分金字塔,每組有五層不同尺度圖像,相鄰兩層相減得到四層DoG,關鍵點搜索就在這四層DoG圖像上。
從上面的描述中可以知道,每組圖像的第一層和最後一層是無法進行比較取得極值的。爲了滿足尺度變換的連續性,在每一組圖像的頂層繼續使用高斯模糊生成3幅圖像,高斯金字塔每組有S+3S+3層圖像,DoG金字塔的每組有S+2S+2組圖像。
尋找尺度空間極值點
尺度空間的極值點需要與空間上所有的相鄰點進行比較,如圖,中間的監測點需要可他同尺度的8個相鄰點,以及上下相鄰尺度的18個相鄰點,工26個相鄰點進行比較。當該點在空間的26領域是極大或極小值時,那麼該點爲該尺度一個特徵點。
僞代碼:
for( int o = 0; o < nOctaves; o++ )//每一個八度
for( int i = 1; i <= nOctaveLayers; i++ )//對八度中的存在具有第1至第nOctaveLayers層高斯差分圖像提取特徵點
{
int idx = o*(nOctaveLayers+2)+i;
const Mat& img = dog_pyr[idx];
const Mat& prev = dog_pyr[idx-1];
const Mat& next = dog_pyr[idx+1];
int rows = img.rows, cols = img.cols;
for( int r = SIFT_IMG_BORDER; r < rows-SIFT_IMG_BORDER; r++)//圖像二維空間.行 {
for( int c = SIFT_IMG_BORDER; c < cols-SIFT_IMG_BORDER; c++)//圖像二維空間.列
{
// search and compare neighborhood to find max/min point
// DoG fit extrema local to get keypoint
}
}
}
關鍵點精確定位
以上極值點是在離散空間中進行搜索的,與真正意義上的極值點還存在差距,可以通過對尺度空間DoG函數進行曲線擬合。
消除邊緣響應
這一步本質上要去掉DoG局部曲率非常不對稱的像素。(略)
對找到的極值點進行曲線插值擬合,並過濾,在opencv中使用的是adjustLocalExtrema
函數。該函數會根據輸入的極值點座標以及極值點所在的組和組內的層得出對應於輸入圖像的座標位置。
求取特徵點的主方向
上一步中精確定位關鍵點後也同時找到了該特徵點的尺度,根據這個尺度,可以得到最接近這一尺度值的高斯圖像。
計算以特徵點爲中心、以3×1.5σ爲半徑的區域圖像的幅角和幅值。
其中L所用的尺度爲每個關鍵點各自所在的尺度。
梯度方向直方圖
梯度方向的直方圖的橫軸是梯度方向的角度(梯度方向的範圍是0到360度,直方圖每36度一個柱共10個柱,或者沒45度一個柱共8個柱),縱軸是梯度方向對應梯度幅值的累加,在直方圖的峯值就是特徵點的主方向。
這種利用關鍵點鄰域像素的梯度方向分佈特性爲每個關鍵點指定方向參數的方法,可以使算子具備旋轉不變性。
至此每個關鍵點有三個信息:位置、尺度、方向,由此可以確定一個SIFT特徵區域。
關鍵點描述子
區域座標軸旋轉
爲了保證特徵矢量具有旋轉不變性,要以特徵點爲中心,在附近鄰域內旋轉θ角,即旋轉爲特徵點的方向。
計算採樣區域梯度直方圖
將座標軸旋轉爲關鍵點的方向後。以關鍵點爲中心取16×18的窗口。利用公式求得每個像素的幅值和梯度,繪製44小塊上的梯度方向直方圖,即可形成一個種子點。
上圖,一個關鍵點由16個種子點組成,每個種子點有八個方向向量信息。最終得到44*8=128個數據,形成128維的SIFT特徵向量。
參考:
Distinctive Image Features from Scale-Invariant Keypoints
https://blog.csdn.net/xiaowei_cqu/article/details/8069548