【MQ笔记】Harris角点检测1:算法详解

目录

什么是角点?

Harris角点检测算法

Harris角点的性质


什么是角点?

正如我们描述一个物体,需要点明颜色、形状、材质等“关键词”一样,当我们处理图片的时候,也要着重关注能反映或描述图像本质的“ 特征(feature)”。这里的特征包括全局特征(直方图、方差)和局部特征(角点、边缘点)等。

角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种重要方法,也称为特征点检测(Feature Point Detection)。如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把这个点称为图像的一个角点(Corner)。更形象一点的话,我们可以把角点理解为平面的交汇处或者边的交点,导致交点的局部区域具有多个不同区域的不同方向的边界。比如说下图中,在窗格A-F中,EF即为我们要找的交点。

角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,有效地提高了计算的速度,有利于图像的可靠匹配,该方法也是特征检测与匹配的基础。

识别角点

在当前的图像处理领域中,角点检测算法可以分为:(1)基于灰度图像的角点检测;(2)基于二值图像的角点检测;(3)基于轮廓曲线的角点检测。

近年来提出的角点检测方法大多是基于灰度图像的角点检测,又可以分为:

(1)基于边缘特征的角点检测。主要分三个步骤:首先,对图像进行预分割;然后,对预分割后得到的图像中边界轮廓点进行顺序编码,得到边缘轮廓链码;最后,根据边缘轮廓链码对图像中的角点进行描述和提取。Wallg和Braday提出了一种基于表面曲率的角点检测算法。为了改善角点检测的稳定性,首先将图像和高斯滤波器卷积,然后计算整个图像的表面曲率,当曲率高于一定阈值,并为局部最大值的点被认为是候选角点。

(2)基于模板的角点检测。一般首先建立一系列具有不同角度的角点模板,然后在一定的窗口内比较待测图像与标准模板之间的相似程度,以此来检测图像中的角点。基于模板的方法主要考虑像素邻域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够大的点定义为角点。首先设计一系列角点模板,然后计算模板与所有图像子窗口的相似性,以相似性判断在子窗口中心的像素是否为角点。

(3)基于亮度变化的角点检测。该算法基于角点相应函数(CRF)对每个像素基于其模板邻域的图像灰度计算CRF值,如果大于某一阈值且为局部极大值,则认为该点为角点。


Harris角点检测算法

Chris Harris 和 Mike Stephens 于1988年Proc of 4th Alvey Vision Conference发表的“A Combined Corner and Edge Detector”中提出了Harris 角点提取算法,又称Plessey算法。harris角点检测是一种直接基于灰度图像的角点提取算法。

Harris角点检测的基本思想是,使用一个固定穿扩在图像上进行任意方向的滑动,比较滑动前与滑动后窗口中的像素灰度变化程度,如果对于任意方向的滑动,都有较大程度的灰度变化,那么我们可以认为该窗口中存在角点。

平坦区域、边缘、角点的区别

对于一张灰度图片中的点(x,y),其灰度值为I{(x,y)}。我们选择一个合适大小的窗口\boldsymbol{W}

当窗口发生移动时,移动前后对应的窗口中的像素点灰度变化如下所示:

E(u,v)=\sum _{(x,y)\in \boldsymbol{W}}w(x,y)[I(x+u,y+u)-I(x,y)]^2

其中:

  • [u,v] 是窗口\boldsymbol{W}的偏移量;
  • (x,y)是窗口\boldsymbol{W}种包含的像素的位置座标;
  • I{(x,y)} 和I{(x+u,y+v)} 分别是像素位置(x,y)\bg_white (x+u,y+v) 对应的图像灰度值;
  • w{(x,y)} 是窗口函数,最简单的情形就是窗口\boldsymbol{W}中的所有像素对应的权重都是1。但是有时候,我们也会用二院高斯函数来表示窗口函数,这样使得靠近窗口\boldsymbol{W}中心的点对灰度变换的贡献增大,而使得原理窗口\boldsymbol{W}中心的点对灰度变换的贡献降低,从而更好的定位角点的位置。如下图所示:
窗口函数的形式

根据上述表达式,我们可以想到,当窗口在平坦区域移动时,窗口的灰度值基本不发生变化,对应E(u,v)\approx 0。但是窗口在图像变化比较明显的区域移动时,那么灰度变化会很明显。Harris算法的最终思想就是计算灰度发生较大变化时窗口中心对对应的位置。在这里的移动方向是指任意方向上的移动,而不是特指的方向。

为了化简E(u,v),我们可以对该表达式进行泰勒展开,以逼近原函数。

一节泰勒展开的表达式为:f(x+u,y+v)\approx f(x,y)+uf_x(x,y)+vf_y(x,y)

那么,就有:

E(u,v)=\sum _{(x,y)\in \boldsymbol{W}}w(x,y)[I(x+u,y+u)-I(x,y)]^2\\ \approx \sum _{(x,y)\in \boldsymbol{W}}w(x,y)[I(x,y)+uI_x+vI_y-I(x,y)]^2\\ =\sum _{(x,y)\in \boldsymbol{W}}w(x,y)[u^2I_x^2+2uvI_xI_y+v^2I_y^2]\\ =\sum _{(x,y)\in \boldsymbol{W}}w(x,y)\begin{bmatrix} u& v \end{bmatrix}\begin{bmatrix} I_x^2 &I_xI_y \\ I_xI_y&I_y^2 \end{bmatrix}\begin{bmatrix} u\\ v \end{bmatrix}\\ =\begin{bmatrix} u& v \end{bmatrix}\ (\sum _{(x,y)\in \boldsymbol{W}}w(x,y)\begin{bmatrix} I_x^2 &I_xI_y \\ I_xI_y&I_y^2 \end{bmatrix}) \begin{bmatrix} u\\ v \end{bmatrix}\\

上式可以表示为:

E(u,v)\approx \begin{bmatrix} u & v \end{bmatrix}\boldsymbol{M}\begin{bmatrix} u \\ v \end{bmatrix}

Harris角点检测并没有通过求每一个像素点对应的E(u,v)来判断角点,而是通过对窗口内的每个像素在 x 方向和 y 方向上的梯度进行统计分析。跟上文一致,我们用 I_x,I_y 表示点(x,y)在 x 方向和 y 方向上的梯度值,因此,每个像素可以得到一个梯度座标(I_x,I_y)

针对平坦区域、边缘区域和角点区域,有下面三种情形(左图)。根据像素梯度座标绘制分布图像(右图)。

像素梯度座标绘制

通过我们可以看到,和其他两种情况相比,角点区域的x 轴、y 轴方向上的梯度分布都比较散。因此,我们可以通过这种特征来判断哪些区域存在角点。

那么具体怎么做呢?

上面我们已经计算出了:

\boldsymbol{M}=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)\begin{bmatrix} I_x^2 &I_xI_y \\ I_xI_y & I_y^2 \end{bmatrix}=\begin{bmatrix} A &C \\ C &B \end{bmatrix}

那么,我们可以将E(u,v)近似地表示为二项函数:

E(u,v)\approx Au^2+2Cuv+Bv^2

其中,A=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)I_x^2B=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)I_y^2C=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)I_xI_y

二次函数本质上是一个椭圆函数,椭圆的长和宽是由的特征值\lambda _1,\lambda _2 决定的(椭圆的长短轴分别是最大、最小特征值平方根的倒数),椭圆的方向是由M 的最大、最小特征值对应的特征向量决定的,如下图所示:

二次函数图像示意图

那也就是说,我们又加了一个约束条件,也就是椭圆的方程:

\begin{bmatrix} u &v \end{bmatrix}\boldsymbol{M}\begin{bmatrix} u\\ v \end{bmatrix}=1

在这个约束条件下,我们再对刚刚的像素梯度座标分布图进行分析处理,绘制得到的图像如下图所示:

可以看到,包含角点的图像中,得到的座标分布图拟合出的“椭圆”相对来说,比较圆一点,也就是长短轴相对接近,而且较大。刚刚我们说了,椭圆的长短轴长度主要取决于其最大、最小特征值的大小,也就是说,包含角点的窗口对应的M 的特征值较大。类似地,我们可以总结出窗口处于不同区域时矩阵的特征值的规律,如下图所示:

总结来说,就是:

  • 像素点梯度座标分布较散、梯度变化程度较大、对应矩阵的特征值都较大时,窗口中含有角点;
  • 像素点的梯度在某一个方向上变化较大、另一个方向上变化较小,相应的特征值一个较大一个较小时,窗口中含有边缘;
  • 像素点的梯度座标分布集中在原点附近、梯度变化幅度非常小、对应M 的特征值都比较小时,窗口处于平坦区域。

通过刚才的讨论我们知道,可以通过矩阵的性质判断窗口所处的区域。但是,如何量化这种“较大”、“较小”的特征呢?

我们可以定义一个角点相应函数(corner response function) R

R=det(\boldsymbol{M})-k(trace(\boldsymbol{M}))^2

其中,det(\boldsymbol{M})=\lambda _1\lambda _2 ,trace(\boldsymbol{M})=\lambda _1+\lambda _2,  \lambda _1,\lambda _2是矩阵M 的2个特征值。k是一个指定的值,它是一个经验参数,一般在0.04~0.06之间。总体来说,增大k的值,角点检测的灵敏度降低,被检测出的角点数量减少;降低k值,角点检测的灵敏度提高,被检测出的角点数量增大。

那么针对上述的三种区域,R的取值如下图所示:

Harris角点检测算法就是对角点响应函数R进行阈值处理,也就是说,我们设定一个阈值,当R > threshold时,提取R的局部极大值,或者提取最大的n个点,从而得到角点。


Harris角点的性质

1. Harris角点具有旋转不变性。

Harris角点检测通过窗口对应的二阶矩阵的特征值得到角点响应值R,从而判断角点。当图像转动时,角点区域的像素点梯度座标和拟合椭圆对应地发生旋转,但是矩阵的特征值(也可以理解为数据点区域的拟合椭圆)不变,因此图像旋转不影响角点的检测。

2. Harris角点检测算子对亮度和对比度的变化不灵敏

这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的擡高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,阈值的选择可能会影响角点检测的结果。

3. Harris角点检测算子不具有尺度不变性

当图像被缩小或放大时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的,角点检测的性能也会发生改变。


参考:

  1. https://www.cnblogs.com/zyly/p/9508131.html

  2. https://www.cnblogs.com/mikewolf2002/p/3547436.html

  3. https://wenku.baidu.com/view/f876c35d6c175f0e7dd13742.html?sxts=1568166574210


关于harris角点检测的理论介绍就到这里啦,该算法的具体实现记得查看下一篇博文:【MQ笔记】Harris角点检测2:算法实现(OpenCV+自主实现)​​​​​​​

拜~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章