一 算法概述
1.核心思路
在搞清楚Harris角点检测算法前,先明白了什么是角点~
如下图,是各种类型的角点。????
但是在一幅图像中,判断某一个像素点是不是角点,核心想法是:
在这样一个绿色方框中,这个窗口的中心点,不管是在竖直方向上移动还是在水平方向上移动,在任意的一个方向移动,这一都无灰度变化。
在这样一个绿色方框中,这个窗口的中心点,在沿着边缘的方向移动时,无灰度变化。
在这样一个绿色方框中,这个窗口的中心点,不管向哪个方向移动。都会有明显灰度变化。
就是给它一个小窗口滑来滑去看它是否有灰度变化。
2.数学表达
(u,v)是竖直方向和水平方向上的偏移;
I(x+u,y+v)是这个像素点偏移后的灰度值;
I(x,y)是这点原灰度值;
相减之后再平方是为了不要出现负数。
将函数泰勒展开:
Ix是图像水平梯度,Iy是图像竖直梯度(梯度的计算,很多梯度算子就可以算,数字图像处理课程学过Sobel算子)
举一个图片的例子:
比如点在这条边上时,上下动一动,这个点不会有灰度变化;左右动一动就有灰度变化了。统计一下水平和竖直方向的梯度:梯度值的分布大多靠近x轴。近似一个椭圆。
点在这种平坦的位置时,向哪个方向移动,都不会有灰度变化。
这个点周围,没有什么像素值的变化,统计一下水平和竖直方向的梯度:可以看到大多都聚集在原点,近似一个小小的圆形。
比如这里一个点。这个点,竖直方向动一动,有明显灰度变化;水平方向动一动,有明显灰度变化。所以它是一个角点。统计一下水平和竖直方向的梯度:近似一个长短半径数值都很大的椭圆形。
记M的特征值,其实就是这个大的椭圆形的长短轴。
3.角点响应函数
可以得出:
①R值只与M的特征值有关
②R<0,边缘点
③R>0,角点
④R≈0,平坦区
二 实验结果
1.对场景1进行Harris角点检测
2.对场景2进行角点检测
3.对场景3进行角点检测
三 错误分析
最开始运行代码只有一张图片可以检测到角点,每张都会出现这个错误,学长说可能是公式中分母为0.
为了不让分母出现0的情况,将代码改为下面这样就可以检测了
四 总结
Harris角点对亮度和对比度的变化敏感度不高,具有旋转不变性,不具有尺度不变性。