系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测
Python+OpenCV图像处理(七)——Harris特征点检测
目录
七、Harris特征点检测
在图像处理领域中,特征点又被称为兴趣点或者角点,它通常具有旋转不变性和光照不变性和视角不变性等优点,是图像的重要特征之一,常被应用到目标匹配、目标跟踪、三维重建等应用中。点特征主要指图像中的明显点,如突出的角点、边缘端点、极值点等等,用于点特征提取的算子称为兴趣点提取(检测)算子,常用的有Harris角点检测、FAST特征检测、SIFT特征检测及SURF特征检测。
注:注意区分边缘检测和特征点检测
7.1 角点
使用一个滑动窗口在下面三幅图中滑动,可以得出以下结论:
- 左图表示一个平坦区域,在各方向移动,窗口内像素值均没有太大变化
- 中图表示一个边缘特征(Edges),如果沿着水平方向移动(梯度方向),像素值会发生跳变;如果沿着边缘移动(平行于边缘) ,像素值不会发生变化
- 右图表示一个角(Corners),不管你把它朝哪个方向移动,像素值都会发生很大变化。
不同类型的角点
图像梯度
在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。 而图像的梯度在数学上可用微分或者导数来表示。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数:
G x ( x , y ) = H ( x + 1 , y ) − H ( x − 1 , y ) G_x(x,y)=H(x+1,y)-H(x-1,y) Gx(x,y)=H(x+1,y)−H(x−1,y)
G y ( x , y ) = H ( x , y + 1 ) − H ( x , y − 1 ) G_y(x,y)=H(x,y+1)-H(x,y-1) Gy(x,y)=H(x,y+1)−H(x,y−1)在实际操作中,对图像求梯度通常是考虑图像的每个像素的某个邻域内的灰度变化,因此通常对原始图像中像素某个邻域设置梯度算子,然后采用小区域模板进行卷积来计算,常用的有Prewitt算子、Sobel算子、Robinson算子、Laplace算子等。
7.2 Harris角点检测算法
算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。
step:
- 当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E ( x , y ) E(x,y) E(x,y) ;
- 对于每个窗口,都计算其对应的一个角点响应函数 R R R;
- 然后对该函数进行阈值处理,如果 R > t h r e s h o l d R > threshold R>threshold,表示该窗口对应一个角点特征。
7.2.1 建立数学模型
让一个窗口的中心位于灰度图像的一个位置 ( x , y ) (x,y) (x,y),这个位置的像素灰度值为 I ( x , y ) I(x,y) I(x,y) ,如果这个窗口分别向 x x x 和 y y y 方向移动一个小的位移 u u u和 v v v,到一个新的位置 ( x + u , y + v ) (x+u,y+v) (x+u,y+v) ,这个位置的像素灰度值就是 I ( x + u , y + v ) I(x+u,y+v) I(x+u,y+v) 。
∣ I ( x + u , y + v ) − I ( x , y ) ∣ |I(x+u,y+v)-I(x,y)| ∣I(x+