【CV学习3】SIFT算法详解
-
SIFT综述
SIFI (Scale Invariant Feature Transform),尺度不变特征变换算法可以从图像中提取独特且不变的特征,用于完成不同视角之间目标或场景的可靠的匹配。该算法的主要思想就是将图像之间的匹配转化成特征向量之间的匹配。
-
SIFT算法具有的特点
- 图像的局部特征,对旋转、尺度缩放、亮度变化保存不变,对视角变化、彷射变化、噪声也保存一定程度的稳定性。
- 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
- 多量性,即使是很少几个物体也可以产生大量的SIFT特征。
- 高速性,经优化的SIFT匹配算法甚至可以达到实时性。
- 扩招性,可以很方便的与其他特征向量进行联合。
-
SIFT特征检测的步骤
1. 尺度空间的极值检测
2.特征点定位
3.特征方向幅值
4.特征点描述
- 尺度空间极值检测
关键点探测的第一步是识别同一目标在不同视角下可被重复分配的位置与尺度。使用尺度空间(连续的尺度函数)在所有可能的尺度下对稳定的特性进行搜索,以实现对于图像的尺度变换具有不变性的位置探测的。首先得到图像的高斯尺度空间,建立高斯金字塔,然后得到高斯差分尺度空间,建立高斯差分金字塔
2.1 高斯金字塔的构造
高斯金字塔的构建主要分为高斯模糊与降采样。首先对要构建的图像依次进行长、宽依次降为一半的降采样,然后对降采样之后的图像进行高斯模糊。高斯模糊可以减少图像的噪声与降低细节的层次。
2.1.1图像的高斯模糊
高斯尺度空间可以在图像金字塔降采样的基础上加上高斯滤波得到,也就是对图像金字塔的每层图像使用不同的参数进行高斯模糊,使每层金字塔有多张高斯模糊过的图像。高斯金字塔有多组,每组又有多层。一组中的多个层之间的尺度是不一样的(也就是使用的高斯参数是不同的)。高斯金字塔中,长、宽相等的图像称为一组(Octave),每组充的每张图像称为一层(Interval)。
注意:
- 每组中最下面一张图像是由前一组第三层图像降采样形成的,相邻组之间尺度关系为
- 相邻两层之间的尺度相差一个比例因子,如果每层有层,则
一副图像其高斯尺度空间可由其和不同的高斯卷积得到
其中,是高斯核函数。表示的是尺度,它的选取决定了尺度空间改图像的模糊程度,值越小,平滑程度越小,保留图像的细节信息越多;越大,平滑程度越大,图像中细节信息越少,代表图像内像素的空间坐标。
高斯金字塔的组数一般是
其中:,分别是图像的行和列。系数可以在之间任意取值,和具体需要的金字塔的顶层图像的大小有关。
高斯模糊参数可由下面关系式得到
其中:为所在的组,为所在的层,为初始的尺度,为每组的层数。
高斯金字塔构建示例
以一个的图像为例,构建高斯金字塔步骤
- 金字塔的组数 ,减去因子,则构建的金字塔的组数,取每组的层数为3。
- 构建第0组,将图像的宽和高都增加一倍,变成。对于第0组的第0层,第1层,第2层
- 构建第1组,对降采样变成。第1组的第0层,第1组的第1层,第1组的第三层
- ….
- 构建第组的,第层
- DoG金字塔的构造
构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,而检测特征点较好的算子是(LoG)
其中:。
使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常使用DoG来近似计算LoG。
定义DoG为:
因此,将相邻的两个高斯空间图像相减就得到了DoG的响应图像。也就是说,高斯金字塔构建成功后,将每一组相邻的两层相减就可以得到DoG金字塔。
2.3 DoG空间极值检测
为了探测局部极大值和极小值,每个样本点都要和它当前图像的8个临近点以及上下尺度的各9个点比较(共计26个点)相比。从上面的描述可以知道,每组图像的第一层和最后一层是无法进行比较取得极值的。为了满足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像,高斯金字塔每组有(S+3)层,DoG金字塔每组有S+2层图像。
2.3.1 尺度变换的连续性
设,也就是每组有3层,则,则高斯金字塔每组有3层,DoG金字塔每组有2层。在DoG金字塔的第一组有两层,分别是,;第二组是,。由于只有两项是无法比较极值的,那么我们需要对每组的图像进行高斯模糊使得尺度形成。对应的下一组有上一章采样得到的三项是,其首项,刚好与上一组最后一项的尺度连续起来。
- 删除不好的极值点(特征点)
- 低对比度的关键点。使用Taylor展开式展开后,若极大值处的对比度小于某个阀值,这个关键点将被开除
- 不稳定的边缘点。DoG对边缘非常敏感。我们构建2*2的Hessian矩阵,对其求特征值和迹并得到一个比例,若比例大于某个阀值,则这个点也要被开除。
- 求取特征点的主方向
目的:经过上面的步骤已经找到了在不同尺度下都存在的特征点,实现了极值点缩放不变性。为了实现凸显旋转不变性,需要给特征点的方向进行赋值。
方法:利用特征点领域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。
找到了特征点,也就可以得到该特征点的尺度,也就可以得到特征点所在的尺度图像
计算以特征点为中心、以为半径的区域图像的幅角和幅值,每个点的梯度的模以及方向可通过下面的公式求得
计算得到梯度方向后,就要使用直方图统计特征点领域内像素对应的梯度方向和幅值。
4.1直方图的构造
梯度方向的直方图的横轴是梯度方向的角度(范围0-360度:直方图是每36度一个柱共计10个柱或者每45度一个柱共计8个柱),纵轴是梯度方向对应梯度幅值的累加。
4.2 方向的确定
在直方图的峰值就是特征点的主方向。具体而言,关键点的方向可以由和主峰值最近的三个柱值最近的三个柱值通过抛物线插值得到。在梯度直方图中,当存在一个相当于主峰值能量的柱值时,则可以将这个方向认为是该特征点辅助方向。
4.3特征点方向的特点
一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Low的论文指出的关键点具有多方向,而且这些点对匹配的稳定性很关键。
得到特征点的主方向后,对于每个特征点可以得到三个信息,即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点
- 关键点描述
目的:使用一组向量来描述关键点也就是生成特征点描述子,这个描述不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率。从而使特征点拥有很强的稳定性
步骤:
- 校正旋转主方向,确保旋转不变性
- 生成描述子,最终形成一个维的特征向量(Lowe论文中说128维时算法效果最好)
- 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。
在实际计算过程中,为了增强稳健性,一般取的领域窗口,取共16个种子点,每个种子点有8个方向,所以是维
左图:
箭头表示特征点梯度方向,长度表示梯度幅值,一个小格代表一个像素。
右图:
为其加权到8个主方向后的效果,关键点的位置即图中的正中间。求得每个像素的梯度大小和方向,并用不同长度和方向的箭头符号在图中表示。然后对其进行加权运算,即可获得右图的结果。右图中一个关键点由共4个包含8个方向信息的种子点组成,这极大提高了算法的稳定性与正确性。
因此,对于每个关键点使用共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。通过对于特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。
- 感谢
- https://zhuanlan.zhihu.com/p/36123150
- https://www.cnblogs.com/wangguchangqing/p/4853263.html
- https://www.cnblogs.com/cuteshongshong/archive/2012/05/25/2506374.html