特征点检测算法汇总

特征点检测算法汇总

FAST

FAST 是一种角点,主要
检测局部像素灰度变化明显的地方,以速度快著称。它的思想是:如果一个像素与邻域的像素差别较大(过亮或过暗) ,那么它更可能是角点。相比于其他角点检测算法, FAST 只需比较像素亮度的大小,十分快捷。它的检测过程如下:
1.在图像中选取像素p , 假设它的亮度为Ip 。
2. 设置一个阔值T( 比如, ι 的20%)。
3. 以像素p 为中心,选取半径为3 的圈上的16 个像素点。
4. 假如选取的画上有连续的N 个点的亮度大于Ip+T 或小于Ip -T , 那么像素p 可以被
认为是特征点(N 通常取12 ,即FAS-12。其他常用的N 取值为9 和11 ,它们分别被
称为FAS-9 和FAS-11)。
5. 循环以上四步,对每一个像素执行相同的操作。
特征点检测算法汇总_第1张图片
在FAS-12 算法中,为了更高效,可以添加一项预测试操作,以快速地排除绝大多数不是角
点的像素。具体操作为,对于每个像素,直接检测邻域国上的第1. 5. 9. 13 个像素的亮度。只有
当这4 个像素中有3 个同时大于Ip+T 或小于ι -T 时,当前像素才有可能是一个角点,否则
应该直接排除。这样的预测试操作大大加速了角点检测。此外,原始的FAST 角点经常出现"扎
堆"的现象。所以在第一遍检测之后,还需要用非极大值抑

FAST 特征点的计算仅仅是比较像素间亮度的差异,所以速度非常快,但它也有重复性不强、
分布不均匀的缺点。此外, FAST 角点不具有方向信息。同时,由于它固定取半径为3 的圆,存
在尺度问题:远处看着像是角点的地方,接近后看可能就不是角点了。针对FAST 角点不具有方
向性和尺度的弱点, ORB 添加了尺度和旋转的描述。尺度不变性由构建图像金字塔,并在金字
塔的每一层上检测角点来实现。丽特征的旋转是由灰度质心法( Intensity Centroid )实现的。

ORB

ORB 特征由关键点描述子两部分组成。它的关键点称为"Oriented FAST" ,是一种改进
的FAST 角点,它的描述子称为B阳EF。因此,提取ORB 特征分为如下两个步骤:

  1. FAST 角点提取:找出图像中的"角点"。相较于原版的FAST , ORB 中计算了特征点的
    主方向,为后续的BRIEF 描述子增加了旋转不变特性。
  2. BRIEF 描述子:对前一步提取出特征点的周围图像区域进行描述。ORB 对BRIEF 进行了
    一些改进,主要是指在BRIEF 中使用了先前计算的方向信息。

ORB中的FAST

尺度通过高斯金字塔,方向通过灰度质心。所谓质心是指以图像块灰度值作为权重的中心。其具体操作步骤如下
1.在一个小的图像块B 中,定义图像块的矩为
特征点检测算法汇总_第2张图片
2. 通过矩可以找到图像块的质心::
特征点检测算法汇总_第3张图片
3. 连接图像块的几何中心O与质心c , 得到一个方向向量,于是特征点的方向可以定义为
在这里插入图片描述
通过以上方法, FAST 角点便具有了尺度与旋转的描述,从而大大提升了其在不同图像之间表述的鲁棒性。所以在ORB 中,把这种改进后的FAST 称为Oriented FAST。

BRIEF描述子

在提取Oriented FAST 关键点后,我们对每个点计算其描述子。ORB使用改进的BRIEF特征描述。
BRIEF 是一种二进制描述子,其描述向量由许多个0 和l 组成,这里的0 和1 编码了关键点
附近两个随机像素(比如p 和q) 的大小关系:如果p 比q 大,则取1 ,反之就取0。如果我们取
了128 个这样的p , q , 则最后得到128 维由0 、l 组成的向量.BRIEF 使用了随机选点的比较,
速度非常快,而且由于使用了二进制表达,存储起来也十分方便,适用于实时的图像匹配。原始
的BRIEF 描述子不具有旋转不变性,因此在图像发生旋转时容易丢失。而ORB 在FAST 特征点
提取阶段计算了关键点的方向,所以可以利用方向信息,计算旋转之后的"Steer BRIEF" 特征使
ORB 的描述子具有较好的旋转不变性。

SIFT

参考链接
https://blog.csdn.net/qq_37374643/article/details/88606351?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166099417016782391850560%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166099417016782391850560&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-88606351-null-null.142v42pc_rank_34_2,185v2control&utm_term=SIFT&spm=1018.2226.3001.4187

SURF

SURF(Speeded Up Robust Features)是对SIFT的一种改进,主要特点是快速。SURF与SIFT主要有以下几点不同处理:

  1、 SIFT在构造DOG金字塔以及求DOG局部空间极值比较耗时,SURF的改进是使用Hessian矩阵变换图像,极值的检测只需计算Hessian矩阵行列式,作为进一步优化,使用一个简单的方程可以求出Hessian行列式近似值,使用盒状模糊滤波(box blur)求高斯模糊近似值。

  2、 SURF不使用降采样,通过保持图像大小不变,但改变盒状滤波器的大小来构建尺度金字塔。

   3、在计算关键点主方向以及关键点周边像素方向的方法上,SURF不使用直方图统计,而是使用哈尔(haar)小波转换。SIFT的KPD达到128维,导致KPD的比较耗时,SURF使用哈尔(haar)小波转换得到的方向,让SURF的KPD降到64维,减少了一半,提高了匹配速度

如果说SIFT算法中使用DOG对LOG进行了简化,提高了搜索特征点的速度,那么SURF算法则是对DoH的简化与近似。虽然SIFT算法已经被认为是最有效的,也是最常用的特征点提取的算法,但如果不借助于硬件的加速和专用图像处理器的配合,SIFT算法以现有的计算机仍然很难达到实时的程度。对于需要实时运算的场合,如基于特征点匹配的实时目标跟踪系统,每秒要处理8-24帧的图像,需要在毫秒级内完成特征点的搜索、特征矢量生成、特征矢量匹配、目标锁定等工作,这样SIFT算法就很难适应这种需求了。SURF借鉴了SIFT中简化近似的思想,把DoH中的高斯二阶微分模板进行了简化,使得模板对图像的滤波只需要进行几个简单的加减法运算,并且,这种运算与滤波器的尺度无关。实验证明,SURF算法较SIFT在运算速度上要快3倍左右。

1.积分图像

SURF算法中要用到积分图像的概念。借助积分图像,图像与高斯二阶微分模板的滤波转化为对积分图像的加减运算。

积分图像中任意一点(i,j)的值ii(i,j),为原图像左上角到点(i,j)相应的对角线区域灰度值的总和,即
在这里插入图片描述式中,p(r,c)表示图像中点(r,c)的灰度值

2.DoH近似

surf构造的金字塔图像与sift有很大不同,Sift采用的是DOG图像,而surf采用的是Hessian矩阵行列式近似值图像。
Hessian矩阵是Surf算法的核心,构建Hessian矩阵的目的是为了生成图像稳定的边缘点(突变点),为下文的特征提取做好基础。每一个像素点都可以求出一个Hessian矩阵:
在这里插入图片描述
当Hessian矩阵的判别式取得局部极大值时,判定当前点是比周围邻域内其他点更亮或更暗的点,由此来定位关键点的位置,
但是利用Hessian行列式进行图像斑点检测时,有一个缺点。由于二阶高斯微分被离散化和裁剪的原因,导致了图像在旋转奇数倍的\pi /4时,即转换到模板的对角线方向时,特征点检测的重复性降低(也就是说,原来特征点的地方,可能检测不到特征点了)。而在\pi /2时,特征点检测的重现率真最高。但这一小小的不足不影响我们使用Hessian矩阵进行特征点的检测。
盒式滤波器
由于高斯核是服从正态分布的,从中心点往外,系数越来越低,为了提高运算速度,Surf使用了盒式滤波器来近似替代高斯滤波器,提高运算速度。 盒式滤波器(Boxfilter)对图像的滤波转化成计算图像上不同区域间像素和的加减运算问题,只需要简单几次查找积分图就可以完成。每个像素的Hessian矩阵行列式的近似值:
在这里插入图片描述
实际运用中,高斯二阶微分进行离散化和裁剪处理得到盒子滤波器近似代替高斯滤波板进行卷积计算,我们需要对高斯二阶微分模板进行简化,使得简化后的模板只是由几个矩形区域组成,矩形区域内填充同一值,如下图所示,在简化模板中白色区域的值为正数,黑色区域的值为负数,灰度区域的值为0。
特征点检测算法汇总_第4张图片
对于σ=1.2的高斯二阶微分滤波器,我们设定模板的尺寸为9×9的大小,并用它作为最小尺度空间值对图像进行滤波和斑点检测。我们使用Dxx、Dxy和Dyy表示模板与图像进行卷积的结果。这样,便可以将Hessian矩阵的行列式作如下的简化:
在这里插入图片描述 使用近似的Hessian矩阵行列式来表示图像中某一点x处的斑点响应值,遍历图像中所有的像元点,便形成了在某一尺度下关键点检测的响应图像。使用不同的模板尺寸,便形成了多尺度斑点响应的金字塔图像,利用这一金字塔图像,就可以进行斑点响应极值点的搜索,其过程完全与SIFT算法类同。

尺度空间表示

通常想要获取不同尺度的斑点,必须建立图像的尺度空间金字塔。一般的方法是通过不同σ的高斯函数,对图像进行平滑滤波,然后重采样图像以获得更高一层的金字塔图像。SIFT特征检测算法中就是通过相邻两层图像金字塔相减得到DoG图像,然后再在DoG图像上进行斑点和边缘检测工作的。
由于采用了盒子滤波和积分图像,所以,我们并不需要像SIFT算法那样去直接建立图像金字塔,而是采用不断增大盒子滤波模板的尺寸的间接方法。通过不同尺寸盒子滤波模板与积分图像求取Hessian矩阵行列式的响应图像。然后在响应图像上采用3D非最大值抑制,求取各种不同尺度的斑点。
如前所述,我们使用9×9的模板对图像进行滤波,其结果作为最初始的尺度空间层(此时,尺度值为s=1.2,近似σ=1.2的高斯微分),后续的层将通过逐步放大滤波模板尺寸,以及放大后的模板不断与图像进行滤波得到。由于采用盒子滤波和积分图像,滤波过程并不随着滤波模板尺寸的增加而使运算工作量增加。
与SIFT算法类似,我们需要将尺度空间划分为若干组(Octaves)。一个组代表了逐步放大的滤波模板对同一输入图像进行滤波的一系列响应图。每个组又由若干固定的层组成。由于积分图像离散化的原因,两个层之间的最小尺度变化量是由高斯二阶微分滤波器在微分方向上对正负斑点响应长度l_{0}决定的,它是盒子滤波器模板尺寸的1/3。对于9×9的模板,它的l_{0}=3。下一层的响应长度至少应该在l_{0}的基础上增加2个像素,以保证一边一个像素,即l_{0}=5。这样模板的尺寸就为15×15。以此类推,我们可以得到一个尺寸增大模板序列,它们的尺寸分别为:9×9,15×15,21×21,27×279×9,15×15,21×21,27×27,黑色、白色区域的长度增加偶数个像素,以保证一个中心像素的存在。
特征点检测算法汇总_第5张图片

采用类似的方法来处理其他几组的模板序列。其方法是将滤波器尺寸增加量翻倍(6,12,24,38)。这样,可以得到第二组的滤波器尺寸,它们分别为15,27,39,51。第三组的滤波器尺寸为27,51,75,99。如果原始图像的尺寸仍然大于对应的滤波器尺寸,尺度空间的分析还可以进行第四组,其对应的模板尺寸分别为51,99,147和195。下图显示了第一组至第三组的滤波器尺寸变化。

特征点检测算法汇总_第6张图片
在通常尺度分析情况下,随着尺度的增大,被检测到的斑点数量迅速衰减。所以一般进行3-4组就可以了,与此同时,为了减少运算量,提高计算的速度,可以考虑在滤波时,将采样间隔设为2。

对于尺寸为L的模板,当用它与积分图运算来近似二维高斯核的滤波时,对应的二维高斯核的参数σ=1.2×(L/9),这一点至关重要,尤其是在后面计算描述子时,用于计算邻域的半径时。
Hessian行列式图像的产生过程
在SURF算法的尺度空间中,每一组中任意一层包括D_{xx},D_{yy},D_{xy}三种盒子滤波器。对一幅输入图像进行滤波后通过Hessian行列式计算公式可以得到对于尺度坐标下的Hessian行列式的值,所有Hessian行列式值构成一幅Hessian行列式图像。
特征点检测算法汇总_第7张图片

4.兴趣点的定位

为了在图像及不同尺寸中定位兴趣点,我们用了3×3×3邻域非最大值抑制。具体的步骤基本与SIFT一致,而且Hessian矩阵行列式的最大值在尺度和图像空间被插值。

5.特征点方向分配

为了保证特征矢量具有旋转不变性,与SIFT特征一样,需要对每个特征点分配一个主方向。为些,我们需要以特征点为中心,以6s(s=1.2∗L/9为特征点的尺度)为半径的圆形区域,对图像进行Haar小波响应运算。这样做实际就是对图像进行梯度运算只不过是我们需要利用积分图像,提高计算图像梯度的效率。在SIFT特征描述子中我们在求取特征点主方向时,以是特征点为中心,在以4.5σ为半径的邻域内计算梯度方向直方图。事实上,两种方法在求取特征点主方向时,考虑到Haar小波的模板带宽,实际计算梯度的图像区域是相同的。用于计算梯度的Harr小波的尺度为4s。
特征点检测算法汇总_第8张图片 其中左侧模板计算X方向的响应,右侧模板计算y方向的响应,黑色表示-1,白色表示+1。用其对圆形领域进行处理后,就得到了该领域内每个点对应的x,y方向的响应,然后用以兴趣点为中心的高斯函数(\sigma =2s)对这些响应进行加权。
为了求取主方向值,需要设计一个以特征点为中心,张角为60度的扇形滑动窗口,统计这个扇形区域内的haar小波特征总和。以步长为0.2弧度左右,旋转这个滑动窗口,再统计小波特征总和。小波特征总和最大的方向为主方向。特征总和的求法是对图像Harr小波响应值dx、dy进行累加,得到一个矢量(m_{w},\theta {w}):
在这里插入图片描述
主方向为最大Harr响应累加值所对应的方向,也就是最长矢量所对应的方向,即
在这里插入图片描述
可以依照SIFT求方向时策略,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该特征点的辅方向。一个特征点可能会被指定具有多个方向(一个主方向,一个以上辅方向),这可以增强匹配的鲁棒性。和SIFT的描述子类似,如果在m
{w}中出现另一个大于主峰能量max[m_{w}]的80%时的次峰,可以将该特征点复制成两个特征点。一个主的方向为最大响应能量所对应的方向,另一个主方向为次大响应能量所对应的方向。
特征点检测算法汇总_第9张图片
特征点特征矢量生成
在SIFT中关键点描述是选取了关键点周围16
16的领域,又将其划分为44的区域,每个区域统计8个方向梯度,最后得到44*8=128维度的描述向量。

SURF中,我们在关键点周围选取一个正方形框,方向为关键点的主方向,边长为20S。将其划分为16个区域(边长为5S),每个区域统计25个像素的水平方向和垂直方向的Haar小波特性(均相对于正方形框的主方向确定的)

生成特征点描述子,需要计算图像的Haar小波响应。在一个矩形区域来计算Haar小波响应。以特征点为中心,沿上一节讨论得到的主方向,沿主方向将20s×20s的图像划分为4×4个子块,每个子块利用尺寸2s的Harr模板进行响应值计算,然后对响应值进行统计∑dx、∑|dx|、∑dy、∑|dy|形成特征矢量。如下图2所示。图中,以特征点为中心,以20s为边长的矩形窗口为特征描述子计算使用的窗口,特征点到矩形边框的线段表示特征点的主方向。
特征点检测算法汇总_第10张图片
将20s的窗口划分成4×4子窗口,每个子窗口有5s×5s个像素。使用尺寸为2s的Harr小波对子窗口图像进行其响应值计算,共进行25次采样,分别得到沿主方向的dy和垂直于主方向的dx。然后,以特征点为中心,对dy和dx进行高斯加权计算,高斯核的参数为σ=3.3s(即20s/6)。最后分别对每个子块的响应值进行统计,得到每个子块的矢量:
在这里插入图片描述
由于共有4×4个子块,因此,特征描述子共由4×4×4=64维特征矢量组成。SURF描述子不仅具有尺度和旋转不变性,而且对光照的变化也具有不变性。使小波响应本身就具有亮度不变性,而对比度的不变性则是通过将特征矢量进行归一化来实现。图3 给出了三种不同图像模式的子块得到的不同结果。对于实际图像的描述子,我们可以认为它们是由这三种不同模式图像的描述子组合而成的。
特征点检测算法汇总_第11张图片
为了充分利用积分图像进行Haar小波的响应计算,我们并不直接旋转Haar小波模板求得其响应值,而是在积图像上先使用水平和垂直的Haar模板求得响应值dy和dx,然后根据主方向旋转dx和dy与主方向操持一致,如下图4所示。为了求得旋转后Haar小波响应值,首先要得到旋转前图像的位置。旋转前后图偈的位置关系,可以通过点的旋转公式得到:
在这里插入图片描述
得到点(j,i)在旋转前对应积分图像的位置(x,y)后,利用积分图像与水平、垂直Harr小波,求得水平与垂直两个方向的响应值dx和dy。对dx和dy进行高斯加权处理,并根据主方向的角度,对dx和dy进行旋转变换,从而,得到旋转后的dx’和dy’。其计算公式如下:
特征点检测算法汇总_第12张图片
特征描述子的维数
一般而言,特征矢量的长度越长,特征矢量所承载的信息量就越大,特征描述子的独特性就越好,但匹配时所付出的时间代价就越大。对于SURF描述子,可以将它扩展到用128维矢量来表示。具体方法是在求∑dx、∑|dx|时区分dy<0和dy≥0情况。同时,在求取∑dy、∑|dy|时区分dx<0和dx≥0情况。这样,每个子块就产生了8个梯度统计值,从而使描述子特征矢量的长度增加到8×4×4=128维。

为了实现快速匹配,SURF在特征矢量中增加了一个新的变量,即特征点的拉普拉斯响应正负号。在特征点检测时,将Hessian矩阵的迹的正负号记录下来,作为特征矢量中的一个变量。这样做并不增加运算量,因为特征点检测进已经对Hessian矩阵的迹进行了计算。在特征匹配时,这个变量可以有效地节省搜索的时间,因为只有两个具有相同正负号的特征点才有可能匹配,对于正负号不同的特征点就不进行相似性计算。

简单地说,我们可以根据特征点的响应值符号,将特征点分成两组,一组是具有拉普拉斯正响应的特征点,一组是具有拉普拉斯负响应的特征点,匹配时,只有符号相同组中的特征点才能进行相互匹配。显然,这样可以节省特征点匹配的时间。如下图5所示。
特征点检测算法汇总_第13张图片
SURF算法与SIFT算法总结对比
(1)在生成尺度空间方面,SIFT算法利用的是差分高斯金字塔与不同层级的空间图像相互卷积生成。SURF算法采用的是不同尺度的box filters与原图像卷积

(2)在特征点检验时,SIFT算子是先对图像进行非极大值抑制,再去除对比度较低的点。然后通过Hessian矩阵去除边缘的点。

SURF算法是先通过Hessian矩阵来检测候选特征点,然后再对非极大值的点进行抑制

(3)在特征向量的方向确定上,SIFT算法是在正方形区域内统计梯度的幅值的直方图,找到最大梯度幅值所对应的方向。SIFT算子确定的特征点可以有一个或一个以上方向,其中包括一个主方向与多个辅方向。
SURF算法则是在圆形邻域内,检测各个扇形范围内水平、垂直方向上的Haar小波响应,找到模值最大的扇形指向,且该算法的方向只有一个

(4)SIFT算法生成描述子时,是将1616的采样点划分为44的区域,从而计算每个分区种子点的幅值并确定其方向,共计448=128维。
SURF算法在生成特征描述子时将20s20s的正方形分割成44的小方格,每个子区域25个采样点,计算小波haar响应,一共444=64维。
综上,SURF算法在各个步骤上都简化了一些繁琐的工作,仅仅计算了特征点的一个主方向,生成的特征描述子也与前者相比降低了维数。

你可能感兴趣的:(算法,计算机视觉,人工智能)