一、Harris角点检测器
概念:Harris 角点检测算法(也称 Harris & Stephens 角点检测器)是一个简单的角点检测算法。该算法的主要思想是,如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点。该点就称为角点。
1、角点的特征
局部窗口沿各方向移动,均产生明显变化的点;图像局部曲率突变的点;轮廓之间的交点;对于同一场景,即使视角发生变化,通常具备稳定性质的特征;该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化。
2.HARRIS角点检测的基本思想
3.HARRIS角点检测的数学表达
w(x,y)表示矩形窗口,I(x,y)表示该点像素的强度,u与v表示窗口的偏移量,若在任意方向都存在着较大灰度的变化,则判断该点是角点。我们可以使用高斯权重矩阵来突出变化较大的点,赋予更大的权值。
使用一阶泰勒公式来简化上述的函数:
矩阵表示:
Harris角点检测算法优点:
旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)。
对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;
对于图像灰度尺度变化不变。
Harris角点检测算法缺点:
它对尺度很敏感,不具备几何尺度不变性。
提取的角点是像素级的
4.HARRIS角点检测实例
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
# 读入图像
im = array(Image.open('./img/JMU.jpg').convert('L'))
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim
figure()
gray()
#画出Harris响应图
subplot(141)
imshow(harrisim1)
print (harrisim1.shape)
axis('off')
axis('equal')
threshold = [0.01,0.05,0.1]
for i, thres in enumerate(threshold):
filtered_coords = harris.get_harris_points(harrisim, 6, thres)
subplot(1, 4, i+2)
imshow(im)
print(im.shape)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
show()
(a)为 Harris 响应函数;(b、c、d)分别为使用阈值 0.01、0.05 和 0.1 检测出的角点
由以上结果我们可以知道:增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。使用阈值 0.01、0.05 和 0.1 检测出的角点依次减少。
5、图像中寻找对应点
Harris 角点检测器仅仅能够检测出图像中的兴趣点