Harris角点检测原理
Harris角点检测的基本原理:类似于边缘检测,只不过边缘检测只判断单个方向的梯度,而角点检测判断多个方向的梯度/相似性。
对于一张灰度图,计算在点(x, y)处平移(Δx, Δy)后的自相似性c:
W(x, y)表示以点(x, y)为中心的窗口;而w(x, y)是每个像素的权重,既可以是常数,也可以是高斯加权函数;P(u, v)表示坐标为(u, v)的像素值。上述公式表示计算窗口滑动前后,窗口中的每个像素及其对应像素的差值加权总和。
对平移后的像素点进行泰勒一阶展开,可得:
于是相似性c简化后如下,此时可以看出这是一个椭圆函数:
其中
经过对角化消除C后得:
可以看出λ越大,表示平移前后的滑窗灰度值差别越大。λ1大表示在横坐标上相差较大,λ2大表示在纵坐标上相差较大。当λ1和λ2的值都很大且值相近时,判断(x, y)为物体角点。
于是可以通过计算角点响应值R来判断该点是否为角点。
其中k为系数,通常取值0.04 ~ 0.06。R>>0表示该点为角点,R≈0表示该点为平坦区,R<<0表示该点为边界。
OpenCV
1 | cv2.cornerHarris(img, blockSize, ksize, k) |
- img:输入图像;
- blockSize:滑动窗口的大小;
- ksize:Sobel求导中使用的矩阵大小;
- k:计算角点响应值的系数。
检测结果: