2.5 图像角点检测
底层视觉的重要任务之一就是提取图像中的各种特征,为后续视觉处理任务提供支撑。而除边缘外,角点为另外一个常用的重要特征,并且角点对几何变换具有较好的鲁棒性,因此在计算机视觉任务中扮演着重要的角色。
2.5.1 图像角点检测基本原理及Harris角点检测
以下面比较极端的图像为例,从中取出三个小区域进行角点检测,如图2.26所示。图中的白色框作为一个滑动窗口,若对该窗口内的像素值做求和操作,则右边最上面的滑动窗口无论往哪个方向做小量滑动,其值都不会发生任何变化。而右边中间的窗口则不一样,若该窗口水平方向滑动,则其值不会发生变化;而若该窗口上下滑动,则其值会发生变化。右边最下面的窗口无论如何滑动窗口都会造成值发生变化。从图中也可以看出,只有当图像处于角点区域时,若任意滑动窗口,则滑动窗口覆盖下的区域像素值之和都会发生变化。因此一般以此为特征来检测图像中的角点,或称感兴趣点。当然,也可以采用一些简单的算法,如两条曲线的交点等。
通常情况下,图像的噪声会对角点的检测产生较大的影响,为了消除噪声的影响,常采用低通滤波器对图像进行预处理,如采用高斯低通滤波器进行处理,然后再采用滑动窗口进行处理。下面假设这种低通去噪的处理采用权值窗口w来表示。
图2.26 角点检测
在图2.26中,左图为原始图像,每个小区域的像素值都没有变化;右图中白色框为滑动窗口,在右边第一行的图像中,无论滑动窗口如何滑动,滑动窗口内的像素值之和都不会发生变化;在右边第二行的图像中,滑动窗口左右滑动窗口内像素值之和都不会发生变化,但在上下滑动时,窗口内像素值之和会发生变化,这种情况对应水平方向的边缘;而在右边第三行的图像中滑动窗口正好位于角点上,这时候无论往哪个方向移动都会造成窗口内的像素值之和发生变化。
假设滑动窗口在水平和竖直方向上移动的距离分别用u和v来表示,图像像素值用I(u,v)表示,则在窗口内移动(u,v)后,窗口内像素值之差可以表示为
对I(x+u,y+v)在(x,y)处做一阶泰勒展开:
其中,O(u2,v2)表示二阶无穷小,将其代入式(2.29)可得
进一步,若将窗口在原图像上做滑动处理,以点(x,y)为中心点,分别进行计算,则可以得到一幅差值图像V,采用一般的表示形式,可以将其表示为
其中,,易知det(M)=AB−C2。此时根据行列式M的两个特征值λ1、λ2的情况来判断当前点(x,y)是否为角点。实际上,其两个特征值对应这个矩阵的两个主轴方向,哪个方向上的方差越大,其对应的特征值越大,说明这个方向上在滑动窗口滑动时变化大。同时,由前面的介绍可知,角点处的值在两个方向都应该比较大,说明滑动窗口的差值变化大,对应行列式表明两个特征值的乘积大,并且任意一个特征值也不小。而若对应边缘,则表明窗口移动只在水平或者竖直方向上变化比较大,此时对应两个特征值中的一个值比另一个值大,但其乘积较小。若对应平坦区域,则表明行列式的值会很小,此时对应两个特征值都比较小,近似为0,如图2.27所示。注意,角点对应的行列式的值会比较大,因此一般在判断角点时就可以在差值图V中通过计算其局部极大值点来体现。
图2.27 根据滑动窗口像素值变化来对点进行分类
例如,一种简单的Harris角点检测算法,首先可以分别对原始图像计算其水平Ix和竖直梯度图Iy;其次分别计算其各自的平方与两者的乘积Ix·Iy,分别进行高斯低通平滑;然后再计算,设定窗口大小,对其中的非局部极大值进行抑制;最后根据与阈值来比较确定是否为角点。
注意,在原始的Harris算法中,采用如下的角点响应函数
来进行判断,根据线性代数的知识,上述的响应函数等价于R=λ1λ2−k(λ1+λ2)2。实际上根据上面的分析,R的值越大,说明这两个特征值必定也越大。在实际使用中,一般k取一个较小的值,如0.04~0.06,在原始文献中Harris建议取0.04,可以获得较好的结果。
如图2.28 是采用Harris角点检测后的结果,其中高斯低通窗口大小为5×5,尺度参数σ=0.8,非极大值抑制邻域为5×5。设定阈值越大,获得的角点越少,其鲁棒性也就越好。但原始的Harris角点检测算法不具有尺度不变性,即当图像缩小或放大后,Harris点不一定还存在,此时可以对图像进行高斯低通滤波来处理不同尺度下的检测问题。
图2.28 采用Harris角点检测后的结果
根据特征值的关系,尤其是两个特征值都必须比较大,可以进一步改进Harris角点检测算法。Shi-Tomasi角点检测即对最小特征值设定阈值来强化角点的检测,这样可以在满足大于给定阈值的最小特征点上进一步选取满足要求数量的最大特征值作为鲁棒性较高的角点。
2.5.2 FAST角点检测
直观上,角点处的像素值肯定与周围邻域的像素值有较大的差别,这种差别的模式是可以确定的,因此需要考虑图2.29中的中心像素与其周边像素的差值,若其周边与当前点像素值差值大的点足够多,则当前点很可能是角点。例如,图2.29中当前点的半径为3的圆周上的点,若有连续12个点的像素值与当前点的像素值差大于某个阈值,则可认为是角点。进一步使用机器学习的方法来进行加速,对同一类图像(如同一场景的图像)可以在16个方向上进行训练,得到一棵决策树,从而在判定某个像素点是否为角点时,不再需要对所有方向进行检测,而只需要按照决策树指定的方向进行2、3次判定即可确定该点是否为角点。
图2.29 Fast角点检测