0.简介
本节对ORB特征、SIFT特征、SURF特征、Harris角点、Shi-Tomas角点的提取与描述子计算原理进行总结,其中Harris角点、Shi-Tomas角点是关键点,没有对应的描述子,一般用于光流跟踪(Vins系列算法)。
综合所有的特征检测算法来看,所有的方法本质上都是通过计算像素灰度梯度检测关键点位置,ORB特征通过与邻域像素进行灰度值比较得到,其余SIFT,SURF,Harris角点、Shi-Tomas角点均都涉及到一个Hessian矩阵(由离散像素二阶导得到)求解问题,根据Hessian矩阵判别式的值或者特征值进行判断
1. ORB特征
ORB特征提取和BRIEF描述子计算在2.1节已经做过详细的介绍,这里只进行简单总结
-
fast特征点的提取方式
对于某个像素,如果其周围一圈有连续N个像素的亮度与该像素的亮度之差均大于或均小于某个阈值,则认为该像素是一个Fast关键点.阈值为经验值,在ORBSLAM中设置了7和20两个阈值.
-
oritened Fast关键点的尺度不变性设计
对图像进行了金字塔处理,在金字塔的每一层都提取特征点,通过匹配不同层上的图像特征实现尺度不变性.例如,如果相机后退,则可以在上一帧图像金字塔的上层和下一个图像金字塔的下层中找到匹配.
-
oritened Fast关键点的旋转不变性设计
以Fast特征点为圆心选定一块像素区域,计算所有像素的灰度质心,连接圆心和质心得到一个向量,这个向量的角度就是角点的角度。
-
BRIEF描述子提取方式
BRIEF是一个二进制的描述子,计算和匹配的速度都很快。计算步骤如下:-
以关键点为中心,选择一个31×31的像素块
-
在这个块内按照一定的方法选择N对点,N一般取256,这里的方法一般是提前通过学习选择的效果最好的256个位置
-
对于点对{A,B},通过比较这两个点的灰度大小确定一个二值结果,0或者1.
-
这样把256个点对的结果排起来,就形成了BRIEF描述子。
[1 0 1 0 0 ... 1 0 0]
BRIEF的匹配采用汉明距离,非常快,简单说就是看一下不相同的位数有多少个。如下的两个描述子,不同的位数为4。实际上我们选择的点对数为256,那么距离范围就是0~256。
[1 0 1 1 1 0]
[1 1 0 0 1 1]
-
-
rBRIEF描述子旋转不变性设计
基于BRIEF描述子的特征匹配就是计算特征点周围像素块的灰度值差异,rBRIEF的核心思想在于对像素块的处理上,在原来的基础上增加了旋转的信息,就是当图像发生旋转了,特征点的方向肯定发生旋转。根据上一步计算的oriented fast关键点的方向,将像素块旋转同样的角度,然后再描述子计算和汉明距离计算。
2. SIFT特征
参考链接:https://blog.csdn.net/abcjennifer/article/details/7639681
参考链接:https://blog.csdn.net/u010440456/article/details/81483145
- 生成高斯差分尺度空间
- 检测尺度空间的极值点
- 去除对比度较低的点和边缘响应较低的点
- 计算每个特征点的主方向
- 生成关键点描述子
2.1 生成尺度空间
SIFT特征的尺度空间通过创建图像金字塔和高斯卷积生成。其中金字塔图像通过降采样实现,每层图像的宽和高是下层图像的一半。在生成图像金字塔后通过与不同高斯核进行卷积,最终生成高斯差分尺度空间。
SIFT特征的尺度空间由M层N组图像组层,对于每一层图像都是由下一层图像通过降采样得到,每组图像是对每层图像使用不同的高斯核卷积得到,对于每组图像的尺寸是相同的(高斯滤波不改变图像尺寸,降采样是在进行高斯卷积后删除了偶数行和偶数列使得图像缩宽和高缩小为原来的一半)。
2.1.1 高斯差分尺度空间
创建尺度空间的目的在于模拟图像特征的多尺度特征,高斯卷积和是实现尺度变换的唯一线性核,于是一副二维图像的尺度空间可以定义为:
L(x,y,σ)
表示(x,y)处像素值经过高斯卷积后的灰度值,其中G(x,y,σ)
是尺度可变高斯函数:
(x,y)是像素空间坐标,σ大小决定图像的平滑程度。基于大σ值的高斯卷积得到图像的概貌特征,对应粗糙尺度(低分辨率);基于小σ值的高斯卷积得到图像细节特征,对应精细尺度(高分辨率)。为了进一步在尺度空间检测到稳定的关键点,提出高斯差分尺度空间(DOG scale-space)的概念,计算方法如下:
最终可以得到不同σ下的尺度空间
2.1.2 图像金字塔的创建
SIFT特征图像金字塔创建方式和ORB特征有所不同,这里通过对图像降采样得到不同尺度的图像。首先通过不同的高斯核(σ,2σ,4σ…)降采样操作可以得到不同尺度下的图像,每层图像宽和高是下层图像的一半。对于每个尺度成为一个octave,octave的数量由原始图像的大小决定。第0个octave的图像一般为原始图像,有时为了增加金字塔octave的数量也会采用原始图像的上采样结果。
对于每个octave图像,又通过不同的σ值(kσ,k2σ,k3σ…)可以得到由n层尺寸相同但是模糊程度不同的图像构成的高斯尺度空间。
对于每个octave中的每层图像,通过对相邻图像高斯卷积结果做差可以得到高斯差分尺度空间(DOG),整个过程如下所示:
其中对于每一个octave中每一层图像的σ值为:
下图是每个octave有3层图像时,尺度空间的构建情况
2.2 检测DOG尺度空间极值点
为了寻找尺度空间的极值点,每一个采样点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点,如图所示:
在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了3幅图像,高斯金字塔有每组S+3层图像。DOG金字塔每组有S+2层图像.
尺度变化的连续性:
假设s=3,也就是每个塔里有3层,则k=2^(1/s) = 2^(1/3)
,那么按照上图可得Gauss Space和DoG space分别有3个(s个)和2个(s-1个)分量
在DoG space中,1st-octave两项分别是σ,kσ
; 2nd-octave两项分别是2σ,2kσ
;
由于无法比较极值,我们必须在高斯空间继续添加高斯模糊项,使得形成σ,kσ,(k^2)σ,(k^3)σ,k4σ
这样就可以选择DoG space中的中间三项kσ,(k^2)σ,(k^3)σ
(只有左右都有才能有极值),那么下一octave中(由上一层降采样获得)所得三项即为2kσ,(2k^2)σ,(2k^3)σ
,其首项2kσ=2^4/3
。刚好与上一octave末项k^3σ=2^(3/3)
尺度变化连续起来,所以每次要在Gaussian space添加3项,每组(塔)共S+3层图像,相应的DoG金字塔有S+2层图像。
2.3 去除对比度较低的点和边缘响应较低的点
回顾一下,DoG灰度空间函数可以表示为:
这一步在数学上的本质是去掉DoG局部曲率非常不对称的像素,通过拟合三维二次函数以确定关键点的位置和尺度达到亚像素级精度,同时去除低对比度的关键点和不稳定的边缘响应点(DoG算子会产生较强的边缘响应,就是比较容易产生边缘点,但这些边缘点不是真正的SIFT点),以增强匹配稳定性,提高抗噪声能力。
2.3.1 关键点的精确定位
通过上述过程得到的离散空间的极值点(伪)并不是真正的极值点,下图显示了二维函数离散空间得到的极值点与连续空间极值点的差别,利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation),求解真正极值点的原理同ORBSLAM3中求解双目匹配点的亚像素级精度时的抛物线拟合方法相同,不同的是这里已经知道曲线函数直接求导即可。
首先,将DoG函数在尺度空间进行二阶泰勒展开:
对该函数求一阶导数,并令导数为0可以得到极值点为:
因为是在极值点(伪)处展开,所以求得的曲线函数的极值点也是真正的极值点距离伪极值点的偏移量。在极值点处对应的方程的值为:
去掉对比度低的点: 已经知道求得的极值点处对应的极值,如果这个极值比较小说明它与伪极值点处的极值差异比较小,容易受到噪声的干扰从而变得不稳定,因此当极值小于某个经验值(论文中使用0.03)时,删除该点。
2.3.2 消除边缘响应
Hessian matrix实际上就是多变量情形下的二阶导数,他描述了各方向上灰度梯度变化。我们在使用对应点的hessian矩阵求取的特征向量以及对应的特征值,较大特征值所对应的特征向量是垂直于直线的,较小特征值对应的特征向量是沿着直线方向的。对于SIFT算法中的边缘响应的消除可以根据hessian矩阵进行判定.
特征点处的Hessian为:
令α和β代表x和y方向的梯度:
令α=γβ,则:
D的主曲率和H的特征值成正比,令α为较大特征值,β为较小的特征值,则公式(r+1)^2/r
的值在两个特征值相等时最小,随着的增大而增大。值越大,说明两个特征值的比值越大,即在某一个方向的梯度值越大,而在另一个方向的梯度值越小,而边缘恰恰就是这种情况。所以为了剔除边缘响应点,需要让该比值小于一定的阈值。
因此,为了检测主曲率是否在某域值r下,只需检测以下公式是否成立,式(4-7)成立时将关键点保留,反之剔除。在Lowe的文章中,取r=10
2.4 计算特征点方向
概括的讲,通过计算关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数。
-
选择邻域空间范围
以关键点为圆心,3×1.5σ为半径(σ是生成差分尺度空间时使用的高斯模糊系数),选择圆形区域作为该关键点的邻域 -
计算每个像素的梯度幅值和方向
-
计算该关键点邻域内所有像素梯度幅值和方向的分布
用直方图统计邻域像素的梯度方向。梯度直方图的范围是0~360度,其中每45度一个柱,总共8个柱, 或者每10度一个柱,总共36个柱。
2.5 计算SIFT特征描述子
-
SIFT描述子在特征点所处尺度层面内划定特征区域,半径为如下,其中d为我们在一个维度上划分的子块数目,通常为4
-
将该区域划分为共dxd个子块,每个子块内包含多个像素点
-
将划定出来的区域旋转到特征点对应的方向
-
在每个子块内构筑幅值-方向直方图,统计8个方向的梯度幅值。由此该区域可用
8xdxd
维向量表示,由此完成了特征点区域描述子的构建
-
对描述子幅值进行门限化和归一化
即把方向直方图每个方向上梯度幅值限制在一定门限值一下(门限一般取0.2)
特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理。
3. SURF特征
参考链接:https://www.cnblogs.com/zyly/p/9531907.html
- 构建图像尺度空间
- 检测尺度空间的极值点确定特征点位置
- 计算特征点方向
- 生成SURF描述子
3.1 构建图像尺度空间
SURF的尺度空间由M组每组N层图像构成,与SIFT特征的尺度空间不同,SURF尺度空间每组图像以及组内的每层图像尺寸相同,不同组图像之间使用尺寸不同的盒式滤波器进行滤波,同一组不同层图像使用尺寸相同但是尺度空间因子(高斯模糊系数σ)逐渐增大。
3.1.1 积分图像
SURF算法中要用到积分图像的概念。借助积分图,图像与高斯二阶微分模板的滤波转化为对积分图像的加减运算,从而在特征点的检测时大大缩短了搜索时间。
积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算。
求取积分图时,对图像所有像素遍历一遍,得到积分图后,计算任何矩形区域内的像素灰度和只需进行三次加减运算,如下图所示。
图中绿色区域的面积为:A-B-C+D,因为在减法的过程中,多减了一次D,所以最后要加上一个D。
3.1.2 Hessian矩阵近似
在SIFT特征中使用DoG极值定位关键点的位置,类似的SURF特征计算图像二阶微分Hessian矩阵行列式(Determinant of Hessian,DoH)极值定位关键点位置。给定一个点(x,y)在该点处尺度为σ的Hessian矩阵H(x,y,σ)计算公式如下:
Hessian矩阵的判别式为:
在构建Hessian矩阵前需要对图像进行高斯滤波,经过滤波后的Hessian矩阵表达式为:
其中(x,y)为像素位置,L(x,y,σ)=G(σ)∗I(x,y),代表着图像的高斯尺度空间,是由图像和不同的高斯卷积得到。
我们知道在离散数学图像中,一阶导数是相邻像素的灰度差:
二阶导数是对一阶导数的再次求导:
反过来看Hessian矩阵的判别式,其实就是当前点对水平方向二阶偏导数乘以垂直方向二阶偏导数再减去当前水平、垂直二阶偏导的二次方:
通过这种方法可以为图像中每个像素计算出其H行列式的决定值,并用这个值来判别图像局部特征点。Hession矩阵判别式中的L(x,y)是原始图像的高斯卷积,由于高斯核服从正态分布,从中心点往外,系数越来越小,为了提高运算速度,SURF算法使用了盒式滤波器来替代高斯滤波器L,所以在Lxy上乘了一个加权系数0.9,目的是为了平衡因使用盒式滤波器近似所带来的误差,则H矩阵判别式可表示为:
盒式滤波器和高斯滤波器的示意图如下,上面两幅图是9×9高斯滤波器模板分别在图像垂直方向上二阶导数Lyy和Lxy对应的值,下边两幅图是使用盒式滤波器对其近似,灰色部分的像素值为0,黑色为-2,白色为1:
那么为什么盒式滤波器可以提高运算速度呢?这就涉及到积分图的使用,根据上面对Lxx,Lyy,Lxy的求解公式,盒式滤波器对图像的滤波转化成计算图像上不同区域间像素的加减运算问题,这正是积分图的强项,只需要简单积分查找积分图就可以完成。
3.1.3 构造尺度空间
在了解图像积分和Hessian矩阵的基础上就可以了解SURF特征尺度空间的构造方法了,积分图像和盒子滤波器一起使用就相当于原图像经过高斯滤波再进行Hessian矩阵变换。SURF不对图像进行下采样,尺度空间的每组以及组内各层图像的尺寸都是相同的,如下图所示。一般尺度空间有4组,每组4层图像。
在SURF中,每组图像以及组内的每层图像通过不同尺寸的盒式滤波器获得,不同组间使用的盒式滤波器的模板尺寸逐渐增大,同一组不同层图像使用相同尺寸的滤波器,但是滤波器的尺度空间因子σ逐渐增大,各层图像使用的盒式滤波器尺寸如下所示:
3.2 检测尺度空间的极值点确定特征点位置
SURF特征点的定位过程和SIFT算法一致,将经过Hessian矩阵处理的每个像素点(即获得每个像素点Hessian矩阵的判别式值)与其图像域(相同大小的图像)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。如图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层3×3邻域18个像素点,共26个像素点进行比较。初步定位出特征点后,再经过滤除能量比较弱的关键点以及错误定位的关键点,筛选出最终的稳定的特征点。
3.3 计算特征点方向
在SURF算法中,采用的是统计特征点圆形邻域内的Harr小波特征,即在特征点的圆形邻域内,统计60度扇形内所有点的水平、垂直Harr小波特征总和,然后扇形以0.2弧度大小的间隔进行旋转并再次统计该区域内Harr小波特征值之后,最后将值最大的那个扇形的方向作为该特征点的主方向。
-
以特征点为中心,6σ为半径,选择一块圆形区域
-
对原型区域中的每个图像采用Harr小波滤波器进行x和y方向上的运算操作,实际上就是使用harr小波滤波器进行卷积操作,harr小波滤波器的形式如下图所示,其边长为4σ,黑色表示值为-1,白色表示值为+1,经过harr小波滤波器卷积后对每个像素都可以得到在x和y方向的滤波值,dx和dy
-
以特征点为中心,张角为60度的扇形为滑动窗口,以0.2弧度为步长对这个圆形区域进行遍历。对于每个扇形滑动窗口统计这个区域内所有像素harr小波特征总和,即对每个像素的dx和dy进行累加,得到一个矢量(m_w, θ_w)。
-
最终主方向为最大Harr响应累加值对应的方向
3.4 计算描述子
- 在关键点周围选取一个正方形框,方向为关键点的主方向,边长为20S。将其划分为
4x4=16
个区域(边长为5S),每个区域统计25个像素的水平方向和垂直方向的Haar小波特性,当然具体的计算还需要进行一些旋转变换,详细见链接:https://blog.csdn.net/sprd_xiaoqi/article/details/114543950 - 每个子块利用尺寸2s的Harr模板进行响应值计算,然后对响应值进行统计∑dx、∑|dx|、∑dy、∑|dy|形成特征矢量。
- 因为有4x4=16个子块,所以最终可以得到4x4x4=64维的SURF描述子
4. Harris角点
参考链接:https://zhuanlan.zhihu.com/p/150411153
算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。
4.1 Harris角点检测步骤
- 当窗口(局部区域)同时向x(水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E(x,y);
- 对于每个窗口,都计算其对应的一个角点响应函数 R;
- 然后对该函数进行阈值处理,如果 R>threshold,表示该窗口对应一个角点特征。
4.2 Harris角点数学模型
建立数学模型的目的,是为了确定哪些窗口会引起较大的灰度值变化。对于窗口中某个点(x,y)其灰度值为I(x,y),当其移动一个(u,v)的距离后,其对应灰度值为I(x+u,y+v)
,I(x+u,y+v) - I(x,y)
即为窗口在移动是该像素灰度值的变化。
为了更为清晰的确定窗口内的像素灰度变化,选择计算窗口内所有像素灰度值的变化。如果窗口中心点像素是角点,那么窗口移动前后,中心点的灰度值变化非常强烈,所以该点权重系数应该设大一点,表示该点对灰度变化的贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化比较小,于是将权重系数设小一点,表示该点对灰度变化的贡献较小。
因此这里引入窗口函数w(x,y)(其实就是一个高斯核),以计算整个窗口中像素灰度值得变化。设窗口在移动前后的灰度值变化为E(u,v),则当窗口中心像素为角点时,E(u,v)会变得比较大。
为简化计算,将I(x+u,y+v)
进行一阶泰勒展开。
其中对应的矩阵M为:
4.3 Harris角点坐标求解
现在定义了Harris角点的数学模型,下一步就是如何去寻找角点的坐标以及存在角点的对应的窗口。
通过M矩阵的特征值判断
如果特征值在两个方向都比较大就是角点;如果特征值在一个方向比较大是边;如果特征值都很小就是平面。
可以把R看成旋转因子,其不影响两个正交方向的变化分量。经对角化处理后,将两个正交方向的变化分量提取出来,就是λ1和λ2(特征值)。
通过R响应判断
本质上也是根据M矩阵的特征值计算一个分数R,根据分数进行判断:R大于某个阈值,认为是角点;R大于0但小于阈值是图像块;R小于0是边缘。
R的计算方式如下:
Harris角点检测的结果是带有这些分数R的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。
5. Shi-Tomas角点
参考链接:https://blog.csdn.net/qq_40374812/article/details/117016214
Shi-Tomasi角点是Harris角点的改进版。
Harris角点检测算法引入角点响应值R,根据R值的大小来判断是否存在角点和边界。
Shi-Tomasi角点检测算法就是针对R值的计算公式进行了优化和修改。由于Harris角点检测算法的稳定性和α值有关,而α是个经验值,需要我们根据自身经验去设置,不好设定最佳值。
Shi-Tomasi发现,角点的稳定性其实和矩阵M的较小特征值有关(即λ1,λ2),于是直接用较小的那个特征值作为分数。这样就不用调整α值了。
所以Shi-Tomasi 将R值的计算公式改为如下形式:R = min(λ1,λ2)
和Harris一样,如果该分数大于设定的阈值,我们就认为它是一个角点。