http://blog.csdn.net/zhikangfu/article/details/51252692
https://www.52ml.net/2734.html
sift特征检测步骤:
1.尺度空间的极值检测
2.特征点定位
3.特征方向赋值
4.特征点描述
尺度空间:
在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。
尺度空间有两个,一个是图片金字塔,即对图片进行降采样生成不同分辨率的图片(和dl里经常使用的是一样的);另一个是高斯尺度空间,主要是用高斯函数对图片进行模糊处理,δ越大(即标准差),模糊程度越高,这模仿了人类由近到远看物体会越来越模糊的过程。
高斯金字塔:
为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。也就是先生成image pyramid,然后在image pyramid中每一个尺寸的图片再进行高斯模糊生成多个同样尺寸但模糊程度不同的图片。
高斯差分金字塔(DOG):
将生成的高斯金字塔没两个相邻层进行高斯差分就能获得高斯差分金字塔,主要是在组octave内进行,其实这个octave就是image pyramid中的每一个尺寸。
步骤1、极值检测:
生成了高斯差分金字塔,就可以在高斯差分金字塔中检测极值。
为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。如图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较。
从上面的描述中可以知道,每组图像的第一层和最后一层是无法进行比较取得极值的。为了满足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像,高斯金字塔每组有S+3层图像,DoG金字塔的每组有S+2组图像。
整个尺度空间极值检测的过程就如图:
步骤2、获得极值点后还需要对低对比度的特征点和不稳定的边缘响应点进行过滤(公式太多了没看懂)。
步骤3、求特征点主方向(类似于hog)
获得特征点后,以特征点为中心、以3×1.5σ为半径的区域图像的幅角和幅值,每个点L(x,y)的梯度的模m(x,y)以及方向θ(x,y)可通过下面公式求得
计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者没45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向。在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。
步骤4、生成特征描述
过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。特征描述符的生成大致有三个步骤:
- 校正旋转主方向,确保旋转不变性。
- 生成描述子,最终形成一个128维的特征向量
- 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。
为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θθ(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。
旋转后以主方向为中心取8×8的窗口。下图所示,左图的中央为当前关键点的位置,每个小格代表为关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值与梯度方向。最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点。与求主方向不同,此时每个种子区域的梯度直方图在0−360之间划分为8个方向区间,每个区间为45度,即每个种子点有8个方向的梯度强度信息。
对每个关键点使用4×4共16个种子点来描述,这样一个关键点就可以产生128128维的SIFT特征向量
匹配:生成了A、B两幅图的描述子,(分别是k1∗128维和k2∗128维),就将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。
http://blog.rexking6.top/2018/09/22/SIFT%E7%89%B9%E5%BE%81%E8%AF%A6%E8%AF%A6%E8%A7%A3/
https://xmfbit.github.io/2017/01/30/cs131-sift/