SIFT特征点检测

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个种子点组成,每个种子点有八个方向向量信息。最终得到4
4*8=128个数据,形成128维的SIFT特征向量。

参考:
Distinctive Image Features from Scale-Invariant Keypoints
https://blog.csdn.net/xiaowei_cqu/article/details/8069548

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章