尚 硕,曹建荣,汪 明,郑学汉,高 鹤,2
(1.山东建筑大学 信息与电气工程学院,济南 250101;2.山东正晨科技股份有限公司,济南 250101)
在图像处理领域,角点就是图像中的极值点,即像素值或者曲率值等属性较为突出的点,通常意义上一般称边缘线的交点为角点,即局部邻域的延展趋势不同。角点包含了图像的重要信息又称为特征点,角点检测即对图像的特征点进行检测,是在机器视觉系统中对图像特征进行提取的重要方法,对于图像匹配、运动检测、三维重建、目标识别和视频跟踪等是必不可少的关键步骤。
角点检测算法根据作用对象不同可以总结为基于图像灰度、基于二值图像、和基于轮廓曲线的角点检测。应用较为广泛的是基于图像灰度的角点检测,主要针对像素点及其邻域的灰度变化,又可细分为基于梯度、基于模板和基于模板梯度组合,直接对图像灰度进行角点检测较为方便直接,这方面的角点检测算法也较多。二值图像是对图像进行二值化处理得到的图像,常用于辅助其他算法,很少单独使用。对于基于图像轮廓的角点检测算法,通常根据某个点位置的弯曲程度来判断该点是否为角点,一般将轮廓上点的曲率值以及几何位置作为衡量标准。
基于图像灰度的角点检测算法一般将像素值的变化作为衡量标准,认为灰度变化大于一定阈值的点是角点。基于图像灰度的角点检测又细分为基于模板、基于梯度和基于模板梯度组合。基于模板的角点检测算法,顾名思义,首先需要设定大小合适的窗口,然后根据需要创建一系列针对不同角点的模板,利用窗口沿图像移动,依次与所创建的角点模板比较,如果相似则视为角点,否则不认为是角点;基于梯度的方法是利用边缘像素的梯度值来衡量角点是不是存在,图像边缘强度的变化以及边缘方向的变化关系着角点计算数值的大小。
1.1.1 Harris角点检测算法
Chris Harris 和 Mike Stephens[1]在1988年提出了Harris角点检测算法,Harris角点检测算法主要利用待测点的自相关矩阵进行角点判断,通俗来讲就是在图像上使用一个合适大小的窗口,使其沿随意一个方向移动,根据移动前与移动后该窗口中图像像素灰度变化的程度来确定角点,如果该窗口沿着随意一个方向的移动都有很大程度的灰度值变化,那么就可以判定该窗口中可检测到角点。具体步骤如下:
先将图像I和窗函数w(x,y)进行卷积,并求出图像梯Ix,Iy,使用平方和函数E(u,v)定义窗口移动前后像素灰度变化:
E(u,v)=
(1)
w(x,y)是窗函数,可以是矩形窗或者高斯窗,I(x,y)是图像像素值,u,v是移动的像素距离。
将I(x+u,y+v)进行一阶泰勒展开:
I(x+u,y+v)=
(2)
代入公式(1)得:
E(u,v)=
(3)
则得到待检测图像点的自相关矩阵:
(4)
通过判断自相关矩阵H的特征值大小确定角点,如果计算自相关函数H的特征值分解会增加算法复杂度,这里选取Harris角点响应函数为R=det(H)-αtrace(H)2,如果角点响应函数R大于一定的阈值且该点为局部极大值点,则认为该点为角点。
Harris角点检测运算较为简单且具有旋转不变性和光照不变性,其提取的角点特征较为均匀、性能也相当稳定。但是阈值的设定对Harris算法的角点检测效果有很大的影响,如果设定的阈值过小,很多非角点会被当作角点检测出来,造成检测结果不准确;如果设定的阈值过大,很多关键角点会被剔除掉,出现漏检情况。同时,Harris算法对图像进行图像平滑处理采用的是可调窗口的高斯函数,所以检测效果极大程度地依赖于窗口大小的设定,但实际应用中很难控制高斯窗口的大小。
针对算法的不足,众多学者对经典的Harris角点检测算法进行了研究和改进。毛雁明等[2]针对Harris角点检测算法的阈值设定提出了一种双阈值法,即设定大小两个阈值,对提取的角点进行信息的对比,在得到正确的角点信息的基础上还剔除了部分伪角点,剩余的伪角点使用 SUSAN角点检测算法进行剔除,对噪声展现出很好的鲁棒性。李鹏程等[3]通过替换Harris角点检测算法的角点响应函数以及非极大值抑制的模板区域为圆形,避免了设置焦点响应函数中的经验常数,并且如果对图像进行旋转变换,根据圆的性质,这并不会对检测结果产生很大影响。韩松奇等[4]使用B样条函数替代了Harris角点检测算法中的高斯窗口函数,解决了原算法对于使用高斯窗口所带来的一系列问题,采用自适应阈值的方法,解决了原算法需要不断调试来确定阈值的问题,同时通过对角点采取预筛选,提高了算法的检测速度。N次B样条函数定义为:
Bn(x)=
(5)
u(x)是阶跃函数,n是B样条函数的阶数。离散式数字图像的滤波公式为:
g(x,y)=
(6)
f(i,j)是像素 (i,j)处的图像灰度值,Bk*l(x-i,y-i)是B‘条滤波算子。孙万春等[5]提出一种自适应灰度差分均值的思想,有效的提高了Harris角点检测算法的抗噪性能。杨立伟等[6]设定窗口遍历图像,求取中心像素点与其邻域内像素点的灰度值差,并手动设定阈值作为衡量标准,降低了算法的复杂度,解决了Harris角点检测算法检测时间过长的问题。高帅等[7]首先对图像抽骨细化,然后使用一个3*3的框进行角点预筛选并改进了角点响应函数,排除了很多伪角点,提高了运算效率。Tao Luo等[8]将Harris角点检测算法与极大值抑制和FAST角点检测算法结合了起来,进行非角点剔除提高了运算效率和鲁棒性。针对波前编码双目摄像机成像引起的图像缺失和冗余,Qinxiao Liu等[9]在Harris角点检测算法的基础上使用特征值约束并使阈值尽可能小,很好的提高了角点定位的准确度并有一定的准确度。Prateek Sikka等[10]通过结合HLS设计方法提出一种实时、面积优化的Harris角点检测算法,对于相同的目标板所得的结果在面积和速度方面都更优。Chuan Luo等[11]使用Canny边缘检测和灰度差分对图片进行预处理,提高了Harris角点检测算法的检测效率、抗噪声和旋转不变性。
Shi 和Tomasi提出Shi-Tomasi角点检测算法,该算法是对Harris角点检测算法的改进,通过计算像素点自相关矩阵的特征值,比较特征值与阈值的大小关系,若均大于阈值,那么认为该像素点为角点,取得了更好的效果。胡涛等[12]使用抑制半径的方法对Shi-Tomasi角点检测算法进行改进,提高了对PCB图像角点检测的正确率。李雨嫣等[13]将Shi-Tomasi角点检测算法结合不同的并行算法,解决了Shi-Tomasi角点检测算法运算量大、耗时长的问题。彭晓星等[14]通过构建图像金字塔实现在不同尺度下Shi-Tomasi角点的提取,形成候选点集,对候选角点采用双模板组合的方式去除伪角点,实现精提取,增强了图像的抗噪性以及提升了提取角点的精确性。
1.1.2 SIFT角点检测算法
SIFT(Scale-invariant feature transform)是一种较为常用的角点检测算法,在Opencv中可以直接调用,该算法可以很方便获取一个特征点的在尺度和方向上的描述子。SIFT角点检测算法需要在由图像和高斯函数卷积生成的尺度空间上进行检测,高斯函数的计算公式为:
(7)
图像尺度空间L(x,y)的计算公式为:
L(x,y,σ)=G(x,y,σ)*I(x,y)
(8)
1)首先通过创建高斯金字塔和差分高斯金字塔来创建尺度空间(DOG)。高斯金字塔第一组第一层最清晰,大小是原图像的二倍,而第二层是对第一层的高斯滤波操作,对新生成的图层重复高斯滤波操作构成一个组,将第一组最模糊的一层进行二倍下采样作为下一组的初始图象重复高斯滤波操作。差分高斯金字塔是高斯金字塔通过前后两层的差形成的图像构成的,比高斯金字塔层数少一层,计算公式如下:
D(x,y,σ)=
(G(x,y,kσ)-G(x,y,σ))*I(x,y)=
L(x,y,kσ)-L(x,y,σ)
(9)
2)在完成尺度空间构建(DOG)之后,对DOG中的每一个点进行检测,判断是否满足极值条件,即让待测点与三维空间中的相邻像素点进行比较,即该像素点所在层邻域的8个像素点以及其上下两层对应点及其周围的9个像素点,判断该点是否为这26个点中的极值点,若是就认为该点是检测到的一个极值点。
3)对极值点进行三维二次函数的拟合,这样可以很容易地定位角点、剔除边缘响应产生的伪角点,同时还可以剔除对比度较低的角点,这样可以获得匹配效果的增强以及较强的鲁棒性。空间尺度函数二阶泰勒展开式为:
D(x,y,σ)=
(10)
使其导数为0得极值点的位置:
(11)
若D(xmax)≤0.03,则为受噪声干扰的低对比点,认为是非角点。如果高斯差分算子选择不当,会对极值点产生很大的影响,通过Hessian矩阵H计算主曲率,公式如下:
(12)
D的主曲率和Hessian矩阵的特征值是正比关系,令α和β分别为大小两个特征值,有α=γβ:
Tr(H)=Dxx+Dyy=α+β
(13)
Det(H)=DxxDyy-(Dxy)2=αβ
(14)
(15)
4)为了满足当图片旋转时提取的角点不变,则需要确定角点的方向,特征点(x,y)处的梯度值m(x,y)和梯度方向角θ(x,y)通过下式求得:
m(x,y)=
(16)
(17)
其中:L(x,y)表示特征点(x,y)的尺度,用直方图统计梯度值和梯度方向,横坐标表示区间,纵坐标表示在这个区间的梯度值的和,可以很方地看出角点的主方向是最高一柱的方向,该角点的辅助方向为值为最高值的80%及以上的另一柱的方向。
5)为了使图像旋转时特征向量保持不变,旋转角点所在的邻域图像,使其主方向旋转到坐标轴的方向,将特征点所在正方形区域划分为16个块,用直方图统计每个块的梯度值和梯度方向,可以得到一个包含八个方向的 128 维的特征描述子。
SIFT角点检测算法具有尺度不变性、旋转不变性,同时当图像产生亮度变化、对比度变化以及视角变化,对SIFT算法的角点检测效果影响也很小,但是SIFT算法复杂度高,耗时长。
1.1.3 SURF角点检测算法
SURF(Speeded-Up Robust Features)角点检测算法是对SIFT角点检测算法的改进,不仅具有SIFT算法检测准确性高、鲁棒性强的优点,而且还解决了SIFT角点检测算法计算的复杂度高和耗时长的问题。具体步骤为:
1)构造变换图。不同于SIFT角点检测算法是计算图像的尺度变换空间求取DOG图像,SURF角点检测算法计算图像像素点的Hession矩阵行列式求取近似图像。计算图中像素点的Hassion矩阵表示为:
(18)
Lxx(x,σ),Lyy(x,σ),Lxy(x,σ)是图像与高斯函数卷积后进行二次求导所得,通过计算图像像素点的Hession矩阵行列式求取近似图像,计算公式为:
det(H)=LxxLyy-(0.9Lxy)2
(19)
0.9为经验值。该近似模板可以很好地代替高斯滤波和二阶导数的计算这两个步骤。
2)构造高斯金字塔。SIFT角点检测算法同一组中图像大小和高斯模板大小不变,改变的只是尺度σ的大小,而在SURF中图像大小不变,没有降采样,而是改变高斯模板的尺寸和尺度σ,角点检测的速度取得了提高。
3)角点定位。首先将步骤(1)获得的的每个点和它所在层周围及上下两层对应的共26个像素点的值作比较,若它是极值点,则作为候选键点,否则忽略。然后,利用3维线性插值法获取亚像素级的角点,并且增加极值,剔除掉表现不好、不合理的角点,最终只保留几个特征最好的点。
4)确定角点的主方向。为了保证图片旋转时,角点检测的结果不变,采取统计角点领域内的Harr小波响应的方法。如图1所示,计算角点为中心的圆内的Haar小波响应,并选择角度为60度去遍历这个圆形区域,并把圆内每60度内所有点的x和y方向的Haar小波响应值赋高斯权重系数后相加,得到一个矢量,最长矢量的方向就是该角点的方向。
图1 示意图
5)在特征点周围取一个正方形框,并带有上步所检测出来的主方向。以主方向为竖直方向,把该框分为16个子区域并计算haar小波特征,SURF角点检测算法得到的特征点描述子是16*4=64维的向量,是SIFT角点检测算法的特征描述子维度的二分之一,这将大大提高特征匹配的速度。
SURF角点检测算法通过Henssian矩阵求取近似图像并通过Harr小波求取图像角点方向,具有很好的旋转不变性和尺度不变性。但是像素点邻域的梯度方向对角点的主方向的确定影响很大,从而对角点特征向量的求取有很大影响,更重要的是,主方向不太大的偏差角度也会被特征匹配过程放大误差,在实际应用中是导致匹配失败的重要原因。此外,特征向量的提取还依赖于图像的尺度空间,需要选择合适的图像金字塔的层数,否则不利于角点的提取。
1.1.4 SUSAN角点检测方法
SUSAN算法是1997年由牛津大学的Smith等人[15]提出的,具体步骤如下:
1)确定USAN区域,选择一个包含37个像素点大小的圆形模板遍历待测图像,通过逐一比较圆形模板对应图像中每一个像素点的灰度值和中心像素点的灰度值来确定。公式如下:
(20)
(21)
(22)
(23)
角点误报检查:通过计算USAN区域的重心对候选角点进行约束,从而减少伪角点的产生。
4)引入非极值抑制进行角点筛选。
SUSAN角点检测能力较强但是误检率也较高。郑昊等[16]通过结合Canny边缘检测提高了SUSAN角点检测算法的检测效率。
1.1.5 FAST角点检测方法
Edward Rosten和Tom Drummond[17]在2006年提出了FAST(加速段测试的特征)算法,FAST角点检测算法基本思路是比较某像素值与其邻域内足够多的像素值的大小,如果相差较大,则认为该像素可能是角点。具体步骤如下:
1)先选取一个像素点P,用I(p)表示其灰度值。以像素p为中心,画一个包含16个像素点的圆,将像素点记作p1,…,p16,灰度值分别表示为I(p1),…,I(p16)。
2)选定一个阈值为t。
3)首先计算p1、p5、p9、p13(分别在4个方向的4个点)与中心点p的像素值差,如果有至少3个像素点的差不低于门限值,则认为是候选特征点,可以进行步骤(4)的筛选;否则,认为是非角点。
4)若p是步骤(3)所确定的候选点,则计算圆内除中心点外所有点与中心点p的像素值差,如果有至少9个点的像素值不低于门限值,我们就认为是特征点。一般取12个点,并且这个标准被定义为FAST-12,但是在实际应用中选9个点一般能取得较好的效果。
5)对整个图像重复1)到4)步。
6)最终得到的角点可能存在相邻角点,即小区域重复的特征点,这里应用非极大值抑制的方法进行剔除。计算特征点像素值与16个点像素值之差,即FAST得分值,如果有多个特征点,保留FAST得分值最大的特征点。
FAST角点检测算法实现思路简单且计算速度相较于其他算法也很快,但仍存在不足。第一,先进行四点检测的预筛选,后进行十六点检测筛选时存在重复计算的问题;第二,FAST角点检测算法提取的角点仅仅是基于灰度值计算的,不具有旋转不变性;第三,在初步筛选获取候选角点时可能会舍弃掉角点从而出现漏检情况;第四,对图像噪声不具有鲁棒性,且对阈值的设定要求很高。Rosten 2010年提出了对FAST算法的改进FAST-ER,李祥杰等[18]基于FAST-ER改进算法实现了增强现实空间注册技术研究,主要改进在于使用ID3决策树策略对FAST进行了加速,使得其更快。刘志海等[19]通过对图像进行区域分割再使用OTSU算法得到每个区域的阈值提高了FAST角点检测算法的检测效率和检测精度。Wenyi Xiong等[20]针对SAR图像斑点噪声提出了一种改进的FAST角点检测算法,首先通过万有引力定律确定候选角点的方向,其次候选角点与其周围像素点的相似度来抑制受SAR相干斑噪声影响的点,取得了很好的抑制效果。
1.1.6 其他基于图像灰度的角点检测算法
左伟等[21]提出了基于多尺度斜率差分的间接角点检测算法,先对图像应用Canny边缘检测算法,再在横坐标轴和竖坐标轴方向对轮廓点进行分解,然后分别计算3个不同尺度下的斜率差分均值并求取乘积获取角点响应值,最后使用自适应阈值的方法进行判别,对图像噪声具有一定的鲁棒性。高永燕等[22]提出了基于图像金字塔的AGDDs与CNN级联的角点检测算法,将数字图像处理技术与深度学习结合起来,在角点重复率、定位误差等评估标准上表现良好。Junfeng Jing等[23]根据角点的特征设计了一种角点特征表示网络,提出一种新的损失函数以最小化原始图像块与变换后图像块之间的焦点位置定位误差,在检测精度、定位精度、平均重复性等标准下性能较为优越。Hao Wu等[24]提出一种模拟真实成像过程的合成训练数据生成方法解决了深度网络缺乏训练数据的问题,并且在检测过程中可以精确地获得亚像素焦点位置。Xizuo Dan等[25]提出一种基于EDLines 算法的棋盘角检测方法,实验表明该算法在角点检测中不存在漏检和冗余。Liang Wang等[26]提出一种基于深度学习的自适应角点检测方法,首先通过FasterR-CNN模型检测目标获取目标区域坐标,然后在该区域上采用自适应Harris算法检测角点,该方法不仅避免了复杂背景的影响还可以提高角落检测的效率。Zhang Yanling等[27]提出一种基于模板的棋盘角检测方法,首先通过棋盘的特点构造两种角点原型模板,通过卷积核与图像的卷积计算像素点与角点之间的相似度进而区分角点非角点,采非极大值抑制和梯度统计算法进一步筛选出目标角点,具有较强的抗干扰能力。Mingzhe Wang等[28]提出了一种新型的滤波器来增强角点并同时抑制边缘和噪声,简化了角点检测架构和提高了其并行计算性能。Kitchen和Rosenfeld[29]提出的角点检测算法既基于图像的轮廓曲线又基于灰度图像的梯度,他们提出了通过计算图像轮廓曲线的曲率与灰度变化的梯度值的乘积来计算角点响应函数的方法,即Kitchen-Rosenfeld角点检测算法。KLT角点跟踪算法[30]全称Kanade-Lucas-Tomasi Tracking,很好地适用于视频图像序列角点检测问题,首先需要使用Shi-Tomasi角点检测算法检测图像序列中首幅图像的角点,然后使用KLT算法进行追踪,函数会返回当前帧的点,这些点带有状态1或者0,如果在当前帧找到了上一帧中的点,那么这个点的状态就是1,否则就是0。
刘文予等人[31]通过研究图像的形态骨架,提出了一种基于二值图像的角点检测方法,首先通过对图像进行二值化处理获取图像的基本外形视作多边形,那么其骨架的延长线上必然存在特征点,并认为骨架点的最大圆盘半径为0的点是特征点。基于二值图像的处理相较于直接基于图像灰度,计算过程变得更加简单,大大提高了计算的效率,并且能够有效地确算法的实时性。这里需要说明,基于图像灰度的一些算法对于基于二值图像的处理也适用。二值图像在实际应用中应用方向较少,所以仅仅基于二值图像的角点检测算法较为稀少,多用于辅助其他角点检测方法。
1.3.1 CSS角点检测算法
基于曲率尺度空间(CSS)的角点检测算法是由MOKHTARIAN F等在1998年提出的,是基于轮廓曲线的曲率在局部区域上进行特征点的检测,对角点的位置采用多尺度追踪搜索。弧长表示曲线为:
L(μ)=(x(μ),y(μ))
(24)
则曲线随着尺度变化的表达式为:
Lσ=(x(μ,σ),y(μ,σ))
(25)
其中,x,y分别为轮廓曲线上的点的横、纵坐标,x(μ,σ)=x(μ)*g(μ,σ),y(μ,σ)=y(μ)*g(μ,σ)。曲率k表示为:
(26)
通过Canny边缘检测提取出图像的边缘,在一个足够大的σ下通过上述公式计算每个点的曲率大小,当某一点的曲率的绝对值大于曲率阈值且大于相邻点最小曲率点处的2倍时,确定为角点。
CSS角点检测算法可以获得较为准确的角点的位置,并且算法复杂度低、计算量小,角点检测精度高,有很好的匹配效果。但是仍有不足,第一,直接对图像边缘进行计算,不能够准确识别噪声和图像边缘,很容易产生伪角点;第二,在高尺度上对图像进行高斯滤波,会模糊曲线细节,影响角点的位置确定。Changli Mai等[32]提出一种基于区域质心提取的角点检测算法对于局部噪声和水面成像畸变有很好的鲁棒性。
1.3.2 CPDA角点检测算法
基于点到弦距离累积(CPDA)角点检测算法和CSS角点检测算法类似,都是对预先得到的边缘曲线进行角点检测,不同于CSS角点检测算法的曲度计算方法,CPDA角点检测算法是利用点弦距离表示边缘的曲度,从而实现角点定位。边缘曲线上存在n个像素点分别为p1,p2,…,pn,pk-lpk位置的弦为cl,计算pk到cl的距离为dk,k-l,然后弦cl向曲线方向移动一点到pk-l+1pk+1,同样的方法计算点到弦的距离,依次移动到pkpk+l的位置结束,计算所有距离的和:
(27)
如果选取的弦长过小,会导致点与点间距太小而使角点的位置有误差,就会提取到伪角点;选择的弦长太大,大概率会把曲线的峰谷认作成一个特征点。故基于此CPDA角点检测算法选择3种弦长,计算出3个曲度值,并对其进行归一化处理,然后求取乘积。曲度乘积项公式为:
(28)
(29)
如果计算得到的值为所计算区域的最大值,那么初步认为该点为角点,然后使用自适应曲度阈值进行筛选。
CPDA角点检测算法虽然很好地解决了CSS角点检测算法存在的问题,但是其存在相邻角点检测不准确、自适应曲度阈值不稳定、3种不同的弦长难以确定等问题,不少研究者就此做出了改进。白萌萌等[33]提出一种对单一弦长进行角点曲率估计的方法,即选择最优单弦长进行曲率估计,克服CPDA角点检测算法需要确定合适的3种弦长的问题。蒋延杰等[34]通过计算每条边缘线上所有像素点到弦的欧氏距离,选择最大点弦距离大于所设阈值时的像素点作为候选角点,利用非极大值抑制的方法剔除伪角点并得到最终角点,取得了和CPDA角点检测算法相似的检测结果。
1.3.3 ERCM角点检测算法
最小特征值方法是通过求取一段轮廓曲线的协方差方程,分析协方差方程的最小特征值大小来判断是否为角点,但其并没有尺度不变性。张世征等人[35]提出一种新的基于正则化协方差矩阵最大和最小特征值的角点检测方案(ERCM),首先对协方差方程进行正则化:
(30)
2019年Shizheng Zhang等[36]提出一种基于切线到点距离累积技术的角点检测方法,在平均重复率、定位误差和精度指数评判标准下都展现了优越的有效性和效率。2020年Shizheng Zhang等[37]提出一种利用点到质心的距离技术(PCD)进行角点检测,通过实验对比,PCD算法在平均重复率和定位误差这两个角点检测指标上是高效的。2021年Shizheng Zhang等[38]又提出一种基于平行四边形对角线比值(RPD)的角点检测算法,检测速度和精度都获得了较为理想的效果。
1.3.4 其他基于轮廓曲线的角点检测方法
Jiwu Wang等[39]提出一种基于角度的角点检测算法,首先通过CSS算法设定合适的阈值提取候选角点,然后计算距离较远像素处候选角点角度值并利用该阈值进行过滤,能够准确提取出所需角点。Zhiyong Peng等[40]提出一种CCDA角点检测算法,利用级联分类器设计一种角点检测器可以快速丢弃非角点像素,利用梯度方向获取角点,利用二阶导数非极大值抑制的方法获取准确的角点,该算法获得了与FAST算法相当的速度以及比Harris算法更优的精度和鲁棒性。Seyed Mostafa Mousavi Kahaki等[41]提出提出均值投影变换(MPT)作为角分类器和抛物线拟合近似来形成鲁棒检测器,获得了较好地检测结果。Shyh Wei Teng等[42]使用简单的三角形理论和距离计算,提出了两种有效且高效的角点检测方法,检测结果在重复性方面优于CPDA,且具有较低的定位误差。
不同角点检测算法具有不同的优越性但同时也有各自的缺陷,通过不同角点检测算法的结合可以实现优缺点互补,国内外许多研究者就此展开研究,并取得了更好的检测效果。胡晓彤等[43]提出一种基于Harris - CPDA的角点检测算法,将Harris角点算法检测同CPDA角点检测算法结合起来,通过多次筛选候选角点,获得更精准的角点检测结果。蔡欣展等[44]将Harris和FAST角点检测算法结合了起来,先使用FAST角点检测算法进行特征点预筛选,再通过一种抑制半径处理方法进行Harris角点筛选,提高了Harris算法的运算速度,很好地解决Harris算法易产生角点聚簇现象的问题。吴禄慎等[45]将基于CSS的角点检测技术和SIFT角点检测技术结合起来,先通过CSS的角点检测技术检测出角点,然后采用 SIFT 方法确定主方向,表现出良好的尺度不变性、旋转不变性和光照不变性,且匹配效果较好。Yifan Wang等[46]提出一种FAST-Harris融合角点检测算法,首先采用FAST算法获取候选角点,然后使用Harris算法进行筛选,最后利用非极大抑制获取真实角点,获得了较高的检测速度和定位精度,在有损JPEG压缩中鲁棒性最好。
各种角点技术总结见表1。
表1 角点检测技术综合性能总结
角点检测算法的性能评估主要包括总角点数、伪角点数、漏检角点数等,对于角点较少的图片的角点检测我们可以通过肉眼判断,但大部分实际的应用场景复杂且角点较多,我们很难通过肉眼判断检测结果的准确性,所以需要性能评估标准来判断。多数研究者使用标准图像库中的“积木”图片,根据给定的角点信息进行比对。角点重复率是常用的角点检测算法的评估标准,对给定图片进行角点的提取,角点数记为No,然后对图形进行仿射变换、旋转变换、Jpeg压缩、尺度变化等,Nt是变换后检测角点的个数,Nr是对变换前后提取的角点匹配得到匹配角点数,角点重复率如下:
(31)
Mokhtarian等[47]提出了角点数一致性 (CCN,consistence of corner numbers)的概念:
CNN=100%×1.1|Νt-Νo|
(32)
CNN数值越大表明角点检测效果越好。Awrangjeb等[48]提在CCN基础上提出平均重复率(average repeat ability)与定位误差(localization error):
(33)
(34)
其中:(xoi,yoi)和(xti,yti)为变换图像与原图像相应角点的坐标位置。现有关于角点检测算法性能评估标准还比较有限且不够公正,还需进一步探索。
本文选取了一定数量的有代表性的图片对所提到的几种较为主流且新颖的角点检测算法进行评测,并对比实验结果。本实验主要基于python环境,借助角点平均重复率和角点数一致性作为性能评估标准,采用了FAST、SUSAN、SIFT、Shi-Tomas这几种角点检测算法进行试验,检测结果如图2和图3所示,图4、图5、图6给出了针对不同场景的角点检测结果。
图2 角点重复率
图3 角点数一致性
图4 棋盘格角点检测结果
本文根据角点检测的方式对现有的角点检测算法进行了分类与总结,对较为典型的角点检测算法进行了详细描述并对其较新的改进方法进行了分析。角点检测算法的优劣主要看对同一角点在不同的环境和图像变换下的识别能力,本文选择4种较为典型的角点检测算法进行了实验并给出了实验结果。
通过对现有角点检测技术的总结分析以及对近几年相关的改进算法描述为在实际应用中对角点检测技术的选择和改进方向提供了借鉴和参考,综上所述可以看出各种角点检测算法各有优劣,不同的应用需求对于角点检测算法的选择也不同。直接基于图像的角点检测一般是对图像进行全局搜索,实际应用中对于快速、较准确的角点检测需求使用直接基于图像模板的方法完全可以满足,基于边缘轮廓的角点检测方法较少,如果把基于边缘轮廓的角点检测方法和一些其他的变换方法相结合,在提高精度的同时就会降低计算速度,如果对角点的准确性、合理性等要求较高,可以考虑基于轮廓线的多尺度分析的方法。
角点涵盖了图像的重要特征信息,广泛地应用于工业、考古学、农业等多个领域在三维重建中,常常利用多幅图片的角点匹配获取相机外参及被摄物体深度信息;在目标识别中,常常通过对特征点信息计算,获取目标的抽象特征;ORB_SLAM算法实现的定位、追踪和导航也是通过对周围环境进行特征点提取与追踪。虽然现存的角点检测算法有很多,相关的改进方法也在不断地被提出,但是随着科技的不断发展以及角点检测应用领域越来越广泛,对角点检测算法的快速性、准确性、鲁棒性、稠密度等要求越来越高,所以在实际应用中,我们仍可根据自己的需求进行改进。此外角点检测算法的评估标准少且局限,亟待寻求一种较为公正的评估标准。