角点检测(Harris & Shi-Tomas)的原理及OpenCV API 的应用
这篇博客的内容主要时对参考中多篇博客的总结。
1. 角点
在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。关于角点的具体描述可以有几种:
-
1). 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
-
2). 两条及两条以上边缘的交点;
-
3). 图像中梯度值和梯度方向的变化速率都很高的点;
-
4).角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
从求解思路上可以分为两种,一种基于边缘,一种基于图像灰度。前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。早期主要有 Rosenfeld 和 Freeman 等人的方法,后期有 CSS 等方法,参考下图。
基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷,此类方法主要有Moravec 算子、Forstner 算子、Harris 算子、SUSAN 算子等。
这篇文章主要介绍 Harris 角点检测的算法原理。
2. Harris角点
2.1 基本原理
Harris 角点检测是一种直接基于灰度图的角点提取算法,稳定性高,尤其对L型角点(也就是直角)检测精度高。缺点也是明显的,就是运算速度慢。
人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。
- 如果在各个方向上移动这个特定的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点;
- 如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;
- 如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
对于图像 ,当在点 ( x , y ) (x,y) (x,y)处平移 ( Δ x , Δ y ) (Δx,Δy) (Δx,Δy)后的自相似性,可以通过自相关函数给出:
c ( x , y ; Δ x , Δ y ) = ∑ ( u , v ) ∈ W ( x , y ) w ( u , v ) ( I ( u , v ) – I ( u + Δ x , v + Δ y ) ) 2 c(x,y;Δx,Δy)=\sum_{(u,v)∈W(x,y)}w(u,v)(I(u,v)–I(u+Δx,v+Δy))^2 c(x,y;Δx,Δy)=(u,v)∈W(x,y)∑w(u,v)(I(u,v)–I(u+Δx,v+Δy))2
其中, w ( x , y ) w(x,y) w(x,y)是以点 ( x , y ) (x,y) (x,y)为中心的窗口, w ( u , v ) w(u,v) w(u,v)为加权函数,它既可是常数,也可以是高斯加权函数。
根据泰勒展开,对图像 I ( x , y ) I(x,y) I(x,y)在平移 ( Δ x , Δ y ) (Δx,Δy) (Δx,Δy)后进行一阶近似:
I ( u + Δ x , v + Δ y ) = I ( u , v ) + I x ( u , v ) Δ x + I y ( u , v ) Δ y + O ( Δ x 2 , Δ y 2 ) ≈ I ( u , v ) + I x ( u , v ) Δ x + I y ( u , v ) Δ y \begin{aligned} I(u+Δx,v+Δy) =&I(u,v)+I_x(u,v)Δx+I_y(u,v)Δy+O(Δx2,Δy2)\\ ≈&I(u,v)+I_x(u,v)Δx+I_y(u,v)Δy \end{aligned} I(u+Δx,v+Δy)=≈I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy
其中, I x , I y I_x,I_y Ix,Iy是图像 I ( x , y ) I(x,y) I(x,y)的偏导数,这样的话,自相关函数则可以简化为:
c ( x , y ; Δ x , Δ y ) ≈ ∑ w ( I x ( u , v ) Δ x + I y ( u , v ) Δ y ) 2 = [ Δ x , Δ y ] M ( x , y ) [ Δ x Δ y ] \begin{aligned} c(x,y;Δx,Δy)≈&∑_w(I_x(u,v)Δx+I_y(u,v)Δy)^2\\ = &[Δx,Δy]M(x,y) \left[ \begin{matrix} Δx \\ Δy\end{matrix} \right] \end{aligned} c(x,y;Δx,Δy)≈=w∑(Ix(u,v)Δx+Iy(u,v)Δy)2[Δ</