作用是识别兴趣点,SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。
是基于关键点特征向量的描述。
参考博客:
https://www.cnblogs.com/wangguchangqing/p/4853263.html
https://www.cnblogs.com/ronny/p/4028776.html
https://blog.csdn.net/zddblog/article/details/7521424
https://blog.csdn.net/zhikangfu/article/details/51252692 总结了很对具体细节操作的原因....
算法步骤:
1. 构建金字塔且塔的每一层使用多尺度的σ进行滤波(LoG、DoG)(DOG/LOG算子借助高斯尺度变换的特征。确切的说应该是LOG特征,Mikolajczyk发现LOG的极值点(极大值和极小值)比梯度(一阶导数),Hessian(二阶导数矩阵),及harris角点具有更稳定的特征。而DOG具有近似LOG的性质,且比LOG的运算效率更高。);完了之后,在3x3x3(3个维度)区域内,即一个点的26领域内寻找极值(极大或极小),得到的极值定为候选兴趣点。
细节:传送门
2. 子像元插值和删除不稳定的边缘“兴趣”点
子像元插值的详细博文见:传送门
为什么边缘点不稳定点?:
由于DoG对图像中的边缘有比较强的响应值,而一旦特征点落在图像的边缘上,这些点就是不稳定的点。一方面图像边缘上的点是很难定位的,具有定位歧义性;另一方面这样的点很容易受到噪声的干扰而变得不稳定。
不稳定的特征点通过求Hession矩阵的特征值比值实现,大于一定阈值则剔除(入1、入2 相差比较大,可能是边缘点...我的理解是这样)
原博文如下:
在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与2×2Hessian矩阵H的特征值成正比。
3. 找到了在不同尺度下都存在的特征点后,为了实现图像旋转不变性,需要给特征点的方向进行赋值......:确定兴趣点的方向
利用特征点邻域像素的梯度分布特性来确定其方向参数(即画直方图:横轴为0~360度,间隔为36,共10个簇,每个簇的y轴值是这个角度范围内梯度幅值的和。直方图的峰点对应的簇即为特征点的主方向),再利用图像的梯度直方图求取关键点局部结构的稳定方向。图源:传送门
对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向:因为一个点可以是在不同尺度上均是特征点,即它对应的σ是可以不唯一的。
4. 生成特征描述:
- 校正旋转主方向,确保旋转不变性。
- 生成描述子,最终形成一个128维的特征向量
- 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。
以特征点为中心,在附近邻域内将坐标轴旋转θ(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向,旋转后以主方向为中心取 8×8的窗口。下图所示,左图的中央为当前关键点的位置,每个小格代表为关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算。最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示。每个特征点由4个种子点组成,每个种子点有8个方向的向量信息(4x8=32)。这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。
为了增强匹配的稳健性,Lowe建议: 对每个关键点使用 4×4 共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。(16个种,每个种子8个方向:16x8=128)
总结:
SIFT特征以其对旋转、尺度缩放、亮度等保持不变性,是一种非常稳定的局部特征,粗略总结:
- DoG尺度空间的极值检测。 首先是构造DoG尺度空间,在SIFT中使用不同参数的高斯模糊来表示不同的尺度空间。而构造尺度空间是为了检测在不同尺度下都存在的特征点,特征点的检测比较常用的方法是Δ2G(高斯拉普拉斯LoG),但是LoG的运算量是比较大的,Marr和Hidreth曾指出,可以使用DoG(差分高斯)来近似计算LoG。
- 删除不稳定的极值点:完成离散下兴趣点的插值(子像元插值)及删除不稳定的边缘响应点(两个入特征值比值相差很大)。
- 确定特征点的主方向。以特征点的为中心、以 3×1.5σ 为半径的领域内计算各个像素点的梯度幅角和幅值,然后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。
- 生成特征点的描述子。 首先将坐标轴旋转为特征点的主方向,以特征点为中心的16×16的窗口的像素的梯度幅值和方向,将窗口内的像素分成16块(4x4的种子块,即16个种子,每个种子里有16个pixel),每块是其像素内8个方向的直方图统计,共可形成128维的特征向量。16x8=128.
SIFT的缺点
SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在:
1. 实时性不高。
2. 有时特征点较少。
3. 对边缘光滑的目标无法准确提取特征点。
等缺点,如下图7.1所示,对模糊的图像和边缘平滑的图像,检测出的特征点过少,对圆更是无能为力。近来不断有人改进,其中最著名的有SURF和CSIFT。 图源:传送门
code:https://download.csdn.net/download/zddmail/4309418 code源:传送门
应用:
图像匹配:
当两幅图像的SIFT关键点及特征向量(描述特征)生成后,下一步我们采用特征描述子的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。
为什么是DOG算子,Gaussian算子,为什么不是LOG算子?
DOG/LOG算子就是借助高斯尺度变换的特征。确切的说应该是LOG特征,Mikolajczyk发现LOG的极值点(极大值和极小值)比梯度(一阶导数),Hessian(二阶导数矩阵),及harris角点具有更稳定的特征。而DOG具有近似LOG的性质,且比LOG的运算效率更高。
Gaussian滤波器,压制高频信息,而DOG算子在Gaussian滤波器压制高频的基础上,又压制了低频的区域,形成一个带通滤波器。带通,指指定频带通过,在空域上,表现为指定尺度的细节图像保留下来。这个要比普通的高频锐化算法 检测细节的效果好,因为高频锐化不仅增强了细节,还增强了高频噪声。图像增强时,DOG算法中两个高斯核的半径之比通常为4:1或5:1。
DOG算子如何简化计算?
而与LOG算子比较,DOG算子其尺度变化更自由,当高斯核半径比为1:1.6时,才是LOG算子的近似。
DOG算子具有LOG归一化的近似的性质,计算更方便、速度更快,所以采用DOG算子。
什么是octave?
octave不一定就是高斯系数变化从1到 K^7,得到八个图像,一般不需要这么多,3-5个处理层次就可以了。每一级空间抽样(空间分辨率变化)都会有自己独立的octave高斯尺度处理。这样原文里的scale图示就比较好理解了。
对旋转不变性体现在什么地方?
特征点是依赖于位置信息的,所以也隐含着角度旋转的信息。要除去旋转角度信息的依赖性,就是设计一种旋转不变的特征描述子。
一般特征点附近的 梯度 方向,加上特征点的位置,尺度,都是特征点的信息。将这些信息转换为方向无关的信息。
计算特征点的方向,然后将坐标轴旋转为特征点的方向,这样就保证了以后的计算与方向无关了。
计算出这个特征点的16*16邻域的所有点的梯度和方向。再划分为4*4的小窗口,计算每个小窗口的8个主方向(将每个方向上的梯度值累加),形成4*4*8=128的描述子。文章里介绍的更清楚。
对亮度变化不变性体现在什么地方?
因为描述子是基于梯度的,所以它对恒定的亮度变化具有不变性。进行标准化处理,为对比度提供一些不变性。
什么样的点是不好的特征点?为什么?
去除低对比度的关键点和不稳定的边缘响应点。
对于特征对比度,给定一个阈值,只有大于这个阈值才保留。
而对于边缘响应,通过hessien矩阵来计算其主曲率。将主曲率大的响应点去除。对于边缘响应点,其曲率也是比较大的。