算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。
这样就可以将 Harris 角点检测算法分为以下三步:
- 当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E(x,y) ;
- 对于每个窗口,都计算其对应的一个角点响应函数 R;
- 然后对该函数进行阈值处理,如果 R>threshold,表示该窗口对应一个角点特征。
w(x,y)就是一个记录权重的卷积核 ,找到灰度变化最大的像素点
- 左图表示一个平坦区域,在各方向移动,窗口内像素值均没有太大变化;
- 中图表示一个边缘特征(Edges),如果沿着水平方向移动(梯度方向),像素值会发生跳变;如果沿着边缘移动(平行于边缘) ,像素值不会发生变化;
- 右图表示一个角(Corners),不管你把它朝哪个方向移动,像素值都会发生很大变化。
边框意味着像素值发生突变,那么角附近的像素突变最大。
像素值发生很大变化”这一现象可以用图像梯度进行描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。 而图像的梯度在数学上可用微分或者导数来表示。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数:Gx(x,y)=H(x+1,y)−H(x−1,y)Gy(x,y)=H(x,y+1)−H(x,y−1)在实际操作中,对图像求梯度通常是考虑图像的每个像素的某个邻域内的灰度变化,因此通常对原始图像中像素某个邻域设置梯度算子,然后采用小区域模板进行卷积来计算,常用的有Prewitt算子、Sobel算子、Robinson算子、Laplace算子等。
(之前刚好写过sobel算子。。。😊😊)