文章目录
一、harris角点检测原理
1.1基本思想
使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
1.2 数学模型
图像窗口平移[u,v]产生灰度变化E(u,v)为:
上式经泰勒展开后的得到
对局部微小的移动量 [u,v],所以 可以近似得到下式
记M的特征值λ1、λ2,可以将图像上的像素点分类成直线、平面与角点:当λ1和λ2 都比较大,且近似相等时,可以认为是角点。对图像点分类如下图:
3、关于harris角点响应函数R
由于是通过M的两个特征值的大小对图像进行分类,所以,定义角点相应函数R:
于是上图图像点分类图转化为下图:
有结论如下:
- 角点——R为大数值正数
- 边缘——为大数值负数
- 平坦区——为小数值
在判断角点的时候,对角点响应函数R进行阈值处理:R > threshold,提取R的局部极大值。
二、harris角点检测源代码
2.1 计算harris角点响应函数R
算法:
- 使用高斯倒数滤波器计算图像x,y两个方向的梯度值im_x,im_y(使用高斯倒数滤波器计算可在角点检测过程中抑制噪声强度)
- 计算图像两个方向梯度的乘积分别为x方向的平方,y方向的平方,x和y的乘积,同样使用高斯倒数滤波器计算
- 计算局部特征结果矩阵M的特征值
- 计算响应函数的值
def compute_harris_response(im, sigma=3):
'''
对每个像素值计算Harris角点检测器响应函数
:param im:
:param sigma:
:return:
'''
# 计算导数
im_x = np.zeros(im.shape)
im_y = np.zeros(im.shape)
filters.gaussian_filter(im, (sigma, sigma), (0