Python计算机视觉——Harris角点检测
Harris角点检测
概念
基于特征的图像配准方法是图像配准中最常见的方法之一。它不是直接利用图像像素值,二十通过像素值导出的符号特征(如特征点、特征线、特征区域)来实现图像配准,因此可以克服利用灰度信息进行图像配准的缺点,主要体现在以下三个方面:
(1)利用特征点而不是图像灰度信息,大大减少了在匹配过程中的计算量;
(2)特征点的匹配度量值相对位置变化比较敏感,可以提高匹配的精度;
(3)特征点的提取过程可以减少噪声的影响,对灰度
角点
一类重要的点特征:角点(corner points),其定义主要有以下:
(1)局部窗口沿各方向移动,灰度均产生明显变化的点
(2)图像局部曲率突变的点
我们可以直观的概括下角点所具有的特征:
轮廓之间的交点;
对于同一场景,即使视角发生变化,通常具备稳定性质的特征;
该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化;
角点检测
角点检测大致可分为三类:基于灰度图的角点检测、基于二值化图像的角点检测和基于轮廓曲线的角点检测。Harris属于基于灰度图的角点检测。
原理
算法的基本思想
算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
Harris角点检测可分为三步:梯度计算、响应值计算、角点提取。
梯度计算
对图像中的任意一像素点I(x,y),进行自相关平移w(x+∆x、y+∆y)得到自相关函数:
c(x,y,∆x,∆y) = ∑wh(x,y)(I(x,y)-I(x+∆x,y+∆y))2
其中 ∑w表示窗口内的点,h(x,y)表示加权函数,加权函数可根据自己需要进行修改(通过修改源代码)。
由泰勒可得:
I(x+∆x,y+∆y) = I(x,y)+∆xIx(x,y)+∆yIy(x,y)+p ≈I(x,y)+∆xIx(x,y)+∆yIy(x,y)
代入自相关函数可得(加权函数暂时忽略):
c(x,y,∆x,∆y) = ∑w(I(x,y)-I(x+∆x,y+∆y))2 ≈ ∑w((∆xIx(x,y))2+2∆x∆yIx(x,y)Iy(x,y)+(∆yIy(x,y))2)
将上公式用图表示如下:
其中,u和v分别表示∆x和∆y,w(x,y)表示加权函数。Harris算法是通过判断像素值是否在多个方向上有明显变化可转换为为是否在x和y方向上像素值均有明显变化,再转换为Ix或Iy的变化,再转换为M矩阵的特征值λ1,λ2的变化,如下图:
响应值计算
上面计算不易于通过编程实现,Harris通过定义角点响应函数R的方式,用于表示一个角点的Harris响应值,通常用下面表达式度量角点响应:
trace表示为矩阵的迹,det为矩阵的行列式(矩阵的迹:主对角线上的值相加即所有特征值的和),k是常量,一般取值为0.04~0.06,这个参数仅仅是这个函数的一个系数,它的存在只是调节函数的形状而已。
R = λ1λ2-k(λ1+λ2)2
角点提取
通过上面计算出一角点的Harris响应值大小,后通过设定的阈值t,进行判断该点是否为角点(大于t为角点,小于t则不为角点)