Harris Corner Detection原理
使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后窗口中的像素灰度变化程度,如果存在任意方向上的滑动都有着较大灰度变化,那么就认为该窗口中存在角点。

上图中A是角点,B不是角点,如果用一个小窗口(蓝色)在点A处滑动,无论朝哪个方向走,窗口内的像素值都会发生明显的变化,比如窗口往左,那白色像素就越多,红色越少;但是对于B点,无论朝哪个方向滑动,窗口内的像素不变。进一步地有:

如何计算图像的梯度?

一副图像可以看做一个离散的二元函数,行列索引分别表示x坐标和y坐标,每个像素点的灰度值代表函数值。根据连续二元函数的偏导数计算方法有:

但图像是离散的,没有办法使delta x和delta y趋于0,最小只能取1,所以上式可以转换为:

所以对图像的求导相当于对每个像素点做差分运算。上面那种为前向差分,根据所列的求导公式的不同还可以是中心差分:

显然中心差分就相当于用卷积核[-1,0,1]对图像做卷积(忽略系数1/2不影响算法)。比如求图像在(1,1)位置对x方向的偏导数,就等价于用该卷积核去卷积红色窗口。

Sobel卷积核
对图像某个区域使用Sobel核进行卷积相当于对中心点进行滤波和求导。

比如上图,对3乘3区域用Sobel卷积核进行卷积可以分解为滤波操作和求导操作。滤波操作就是对p22左边的元素p21结合左上p11和左下p31进行加权求和得到新的左边元素,对p22右边的元素p23结合右上p13和右下p33进行加权求和得到新的右边元素。

滤完波后进行中心差分:

上面两步的效果就等价于一个Sobel核。
Gaussisan卷积核

比如利用前向差分求点p33的梯度,可以先用高斯核W对以p33为中心的窗口做卷积,再对以p34为中心的窗口做卷积,然后作差即可。

可以进一步将上式写成下面这种形式:

注意这里的x,y是对卷积操作的窗口区域进行索引的,起始索引均为0,虽然看起来f(0,0)表示图像(0,0)位置的元素,但这里就是表示窗口的第一个元素。
如何计算图像任一方向的梯度?
根据二元函数方向导数的定义有:


所以向量(u,v)只有上图所示的8种组合。忽略分母,方向导数可以写为:

角点检测算法


目标:计算图像每个像素点的方向导数,找出在各个方向方向导数都比较大的点。
角点计算的基本数学公式:

这个公式就是建立在方向导数的基础上,平方的目的是为了消除负号,放大误差。

将x,y视作常数,E是关于u,v的函数。


所以近似之后,所要研究的函数E(u,v)就变成了一个二次型函数。

M是一个实对称矩阵。对M进行标准化后,E(u,v)可以写成:


二次型函数在xoy平面上的等高线是歪着的椭圆,标准化之后的等高线是正着的椭圆,等高线越往内高度越低,越往外高度越高。

椭圆的形状由矩阵M的两个特征值控制,长轴和短轴的长度分别和特征值成反比。


如果函数E在平面上的等高线如上图,长轴远大于短轴(或者短轴远大于长轴),可以发现越往短轴移动,高度变化比较显著,而往长轴移动,高度变化较为微弱。
也就是说:(u,v)指向的方向如果是短轴方向,那函数值E就较大,会比取值指向长轴方向的函数值大得多。
如果等高线的长轴和短轴比较接近,如下图:

我们的目标是:找出往任意方向移动,函数值E都比较大且差不多的点,这正可以体现在函数等高线的长短轴长度上。
总结为如下图像:

当两个特征值差异很大时,意味着相同长度的(u,v)向量,朝着一个轴的函数值和朝着另一轴的函数值E差异很大,即梯度变化差异很大。表明是边缘像素点。
两个特征值都很小,函数值E相近且都很小,即沿任意方向梯度变化微弱。表明是灰度均匀区域。
两个特征值都很大,函数值E相近且都很大,即沿任意方向梯度变化显著。表明是角点。
如何定量地描述这种关系?

R函数的形状就如马鞍面:




非极大值抑制
