(15)特征点检测原理与算法

 

角点定义

角点(corner point)通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。而在实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、梯度特征等。

现有的角点检测算法并不都十分的鲁棒。很多方法要求有大量的训练集和冗余数据来防止或减少错误特征的出现。角点检测方法的一个很重要的评价标准是对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、图像旋转等图像变化。

在我们解决问题时,往往希望找到特征点,“特征”顾名思义,指能描述物体本质的东西,还有一种解释就是这个特征微小的变化都会对物体的某一属性产生重大的影响。而角点就是这样的特征。

一般我们认为,角点=兴趣点=关键特征点

关于角点的具体描述可以有以下几种:

  • 一阶导数(即灰度的梯度)的局部最大所对应的像素;

  • 两条及两条以上边缘的交点

  • 图像中梯度值和梯度方向的变化速率都很高的点

  • 角点处的一阶导数最大,二阶导数为0,指示物体边缘变化不连续的方向。

角点检测算法

基本思想

    算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前和滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动, 都有着较大灰度变化,那么我们就可以认为该窗口中存在角点。

目前的角点检测算法可归纳为3类:

  • 基于灰度图的角点检测

  • 基于二值图像的角点检测

  • 基于轮廓曲线的角点检测

数学方法刻画角点特征:

E(u,v)=∑x,yw(x,y)[I(x+u,y+v)−I(x,y)]2

公式解释:

  • [u,v]是窗口的偏移量

  • (x,y)是窗口内所对应的像素坐标位置,窗口有多大就有多少个位置

  • w(x,y)是窗口函数,最简单情形就是窗口内的所有像素所对应的w权重系数均为1.但有时候,我们会将w(x,y)函数设定为窗口中心为原点的二元正态分布。如果窗口中心点是角点时,移动前与移动后,该点的灰度变化应该最为剧烈,所以该点的权重系数可以设定大些,表示窗口移动时,该点在灰度变化贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化几近平缓,这些点的权重系数,可以设定小点,以示该点对灰度变化贡献较小,那么我们自然想到使用二元高斯函数来表示窗口函数。

角点检测算法

Moravec角点检测算法(参考文献[1])

这是一种最早的角点检测算法。尽管这种算法实用性差,但它是许多算法的基础。该算法将角点定义为具有低“自相关性”的。算法检测图像的每一个像素,将图像周边的一个邻域作为一个窗口,并检测这个窗口和周围其他窗口的相关性。这种相关性通过两个窗口间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。

上图为可能遇到的三种情况。

    如果像素位于平滑图像区域内,周围的窗口都会非常相似.如果像素在边缘上,则周围的窗口在与边缘正交的方向上会有很大的差异,在与边缘平行的方向上则较为相似。而如果像素是各个方向上都有变化的特征点,则周围所有的窗口都不会很相似。

基本公式为:E(u,v)=∑x,yw(x,y)[I(x+u,y+v)−I(x,y)]2

Moravec的原理如果有一句话就是:通过滑动二值矩阵窗口寻找灰度变化的局部最大值。

简单理解就是,首先,计算每个像素点的兴趣值,即以该像素为中心,取一个w*w的方形窗口,计算0度、45度、90度、135度四个方向(有些会考虑8个方向)灰度差的平方和,取其中的最小值作为该像素的兴趣点。实际一些算法用水平或对角线上的一个方向灰度差的平方和来近似替代。

具体主要包括四个过程:

1.滑动窗口计算灰度变化

上图中,红色框为原始框,而蓝色框表示右上的滑动框。白色框表示前景255,黑色框表示背景0.那么原始框和滑动框的灰度变化通过对应位置差的平方和来表示,同样根据上式计算另外几个方向的滑动框的灰度变化。

 

2.构造角点映射图

在构造角点映射图前我们先分析一下,通过上式我们凭什么可以检测到角点,看下图

上面四张图中的四个红色框表示我们正在处理的框,第一幅图中的窗表示在目标内部或者背景上,该区域灰度分布均匀。第二幅图中的窗跨在图像的边缘处,当垂直于边缘方向滑动时会导致灰度很大的变化,而沿着边缘滑动窗时,灰度变化较小。第三幅图中的窗在角点处,不管往哪个方向滑动窗口都会导致灰度的很大变化。而第四幅图框内是一个离散点,滑动窗向任何方向滑动也会导致灰度的很大变化。

因此通过上面的描述和分析,我们知道,Moravec算子可以作为一种角点性的度量,这种度量通过求各个方向的滑窗的最小值来表示。

C(x,y)=min(Vu,v(x,y))

我们通过下图来描述角点映射图(the cornerness map)的构造:

上图中的通过Moravec算子计算得到的,其中1表示1×2552,2表示2×2552,通过上图可知:

  • 角点位于局部最大值处,我们可以应用非极大值抑制找到局部最大值(找到真正的角点,因为该点周围可能也有超过阈值的点。)。

  • 离散点(噪声点)与角点有相同的角点性,因此Moravec算子对噪声敏感,但通过增大滑窗的大小可以对噪声起到一定的抑制作用,然而同时增加了计算量。另一方面,可以通过设定一个阈值对cornerness map进行二值化,小于阈值的T的cornerness map设置为0,从而对离散点的局部最大值进行抑制。

  • Moaravec 算子不能应用于图像边界的一定区域(标记为X的区域),对于这部分的区域,一般直接忽略,在cornerness map中这些区域对应的值置为0.

下面对Moravec算子的基本步骤进行简单总结,主要包括:

Moravec算法的缺陷:

  • 1.不具备旋转不变性

  • 2.对边缘点的反应比较强烈

    非极大值抑制(Non-Maximum Suppression,NMS)

    顾名思义,就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一个是是维数一个是大小。

论文《Efficient Non-Maximum Suppression》

Harris角点检测

前面提到,当一个窗口在图像上移动,在平滑区域内,窗口在各个方向上都没有变化。当一个窗口在边缘处,沿着边缘互动时它是没有变化的,而垂直于边缘滑动时是有很大变化的。当窗口在角点处,向各个方向滑动都是有很大的变化的。通过窗口在各个方向上的变化程度,我们可以判断是不是为角点

根据前面介绍的角点的数学特征(窗口平移[u,v]产生灰度变化E(u,v)):

E(u,v)=∑x,yw(x,y)[I(x+u,y+v)−I(x,y)]2

由:I(x+u,y+v)=I(x,y)+Ixu+Iyv+O(u2,v2)得到

 

对于局部微小的移动量[u,v],近似表达为

E(u,v)=∑x,yw(x,y)[Ixu+Iyv]2

E(u,v)≈[u,v]M[uv]

其中M是2×2的矩阵。

 

事实上,我们并不需要求上述E(u,v)来判断角点。而是通过矩阵M来分析。

通过对窗口内每个像素的x方向上的梯度与y方向上的梯度进行统计分析。这里以Ix和Iy为坐标轴,因此每个像素的梯度坐标可以表示成(Ix,Iy)。针对平坦区域,边缘区域以及角点区域三种情形进行分析:

你可能感兴趣的:(Digital,Image)