什么是角点#
若一个小窗口向任意方向移动,灰度都发生显著变化,那便是角点
- 平坦区域:向任意方向移动,灰度变化都很小
- 边缘:沿边缘方向移动,灰度变化小;垂直边缘方向移动,灰度变化大
- 角点:向任意方向移动,灰度变化都很大
数学推导#
用SSD(Sum of Squared Differences)来衡量窗口移动后的灰度变化:
图像I,窗口大小为W=w×w,移动向量为(u,v), 则SSD定义为E:
E(u,v)=x,y∈W∑w(x,y)[I(x+u,y+v)−I(x,y)]2求和符号表示遍历窗口内的每个像素点。
用一阶泰勒展开近似 I(x+u,y+v):
I(x+u,y+v)≈I(x,y)+Ixu+IyvIx=∂x∂I,Iy=∂y∂I带入SSD公式,第二个等号化成二次型形式:
E(u,v)≈x,y∈W∑w(x,y)(Ixu+Iyv)2=x,y∈W∑w(x,y)(Ix2u2+2IxIyuv+Iy2v2)=[uv]x,y∈W∑w(x,y)[Ix2IxIyIxIyIy2][uv]中间那一坨只和窗口内的图像梯度有关,与移动向量无关,记为矩阵M,叫做结构张量(structure tensor):
M=x,y∈W∑w(x,y)[Ix2IxIyIxIyIy2]
- w(x,y)是窗口权重函数,通常是高斯权重,强调窗口中心的像素点。
- M是一个对称正定矩阵,包含了窗口内的梯度信息。
- 特征值λ1,λ2反映了窗口内的灰度变化程度
- 特征向量v1,v2反映了窗口内灰度变化的方向
分类:
- λ1,λ2 都很小:平坦区域
- λ1 很大,λ2 很小:边缘
- λ1,λ2 都很大:角点
TIP关于这个矩阵的特征值λ1,λ2:
Mv1=λ1v1,Mv2=λ2v2代入SSD的二次型表达式:(这里取v1,v2为特征向量,u′,v′为在特征向量方向上的坐标)
E(u,v)=[u′v′]M[u′v′]=λ1u′2+λ2v′2
但直接计算特征值开销较大,Harris 提出一个近似响应函数:
R=det(M)−α⋅trace(M)2=λ1λ2−α(λ1+λ2)2
- α 是经验参数,通常取0.04~0.06
分类
- R<0: 边缘(trace主导)
- ∣R∣≈0: 平坦区域
- R>0 且足够大: 角点
Harris角点检测算法步骤#
符号:I为输入图像.
1. 计算图像梯度 Ix,Iy#
用sobel算子对 整幅图像 进行卷积,得到每个像素的水平和垂直梯度:
Ix=I∗Sx,Iy=I∗Sy2. 计算结构张量 M#
对于得到的梯度图
-
计算每个像素的结构张量:Ix2,Iy2,IxIy,得到三个图像
-
对三图分别进行高斯模糊(卷积),得到三个平滑图(这里也是权重项的由来),然后构建每个像素的结构张量:
M(x,y)=[Gσ∗Ix2Gσ∗IxIyGσ∗IxIyGσ∗Iy2]3. 计算响应函数 R#
对于所有像素,计算响应函数:
R(x,y)=det(M(x,y))−α⋅trace(M(x,y))2
- det(M)=(Gσ∗Ix2)(Gσ∗Iy2)−(Gσ∗IxIy)2
- trace(M)=(Gσ∗Ix2)+(Gσ∗Iy2)
得到一个响应图。
4. 阈值筛选+非极大值抑制#
- 遍历相应图,找到所有 R(x,y)>T 的像素点(T是预设的阈值),这些点是潜在的角点。剩下的置零。
- NMS:对于每个潜在角点,检查其邻域内的响应值,如果该点的响应值不是邻域内的最大值,则将其置零。这样可以确保最终保留的角点是局部极大值。
5. 输出角点坐标#
最终输出所有满足条件的角点坐标 (x,y)。
Harris角点检测的特点#
- 对旋转不变:因为响应函数只依赖于特征值,与方向无关。
- 对光照变化不敏感:因为响应函数依赖于梯度的平方
- 对噪声敏感:因为计算梯度时会放大噪声,所以通常在计算结构张量前会先对图像进行高斯模糊。
- 无法检测尺度变化:因为窗口大小固定,无法适应不同尺度的角点。
:::tip Harris 关键公式速查
| 概念 | 公式 |
|---|
| 窗口移动灰度变化 | E(u,v)=∑w(x,y)[I(x+u,y+v)−I(x,y)]2 |
| 泰勒展开近似 | E(u,v)≈[u v] M [u v]T |
| 结构张量 | M=∑w(x,y)[Ix2IxIyIxIyIy2] |
| 响应函数 | R=det(M)−α⋅tr(M)2=λ1λ2−α(λ1+λ2)2 |
| 判断 | R>0 角点,R≈0 平坦,R<0 边缘 |
:::