在图像处理中,角点是非常重要的特征。为了快速、准确地检测角点,Harris 提出了 Harris 角点检测算法,它基于局部窗口内图像梯度的变化来判断角点。本文将从最基础的孔径问题(Aperture Problem)入手,通过泰勒展开和向量乘法的形式逐步推导 Harris 角点检测的过程,并给出特征值分析和角响应函数的详细解释。
1. 孔径问题的引入
孔径问题常用“理发店门前转灯”进行类比说明。你可以想象一个横着旋转的灯,它看起来像是垂直方向移动,但实际上是水平方向转动。
- 感觉上:垂直移动
- 实际情况:水平旋转
在计算机视觉中,光流的计算就面临类似的问题:在仅有一个小窗口的情况下,无法确定物体的移动方向,尤其在物体具有某种平滑性时,感知的运动方向和实际运动方向可能不一致。这就是“孔径问题”。
2. 图像函数的平移与泰勒展开
在处理图像时,假设我们有一幅灰度图像,它的像素值可以用函数 I ( x , y ) I(x, y) I(x,y) 来表示。这里 x x x 和 y y y 是图像的空间坐标, I ( x , y ) I(x, y) I(x,y) 是在这个点上的像素强度值。Harris 算子的基本思想是当图像发生微小平移时,通过分析像素强度的变化来判断该区域是角点、边缘还是平坦区域。
图像的平移
考虑图像的某个点发生了微小的平移,即从 ( x , y ) (x, y) (x,y) 平移到 ( 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 , y ) I(x, y) I(x,y) 来表示。这里 x x x 和 y y y 是图像的空间坐标, I ( x , y ) I(x, y) I(x,y) 是在这个点上的像素强度值。Harris 算子的基本思想是当图像发生微小平移时,通过分析像素强度的变化来判断该区域是角点、边缘还是平坦区域。
图像的平移
考虑图像的某个点发生了微小的平移,即从 ( x , y ) (x, y) (x,y) 平移到 ( 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+u, y+v) I(x+u,y+v) 进行近似:
I ( x + u , y + v ) ≈ I ( x , y ) + u ∂ I ∂ x + v ∂ I ∂ y + 高阶项 I(x+u, y+v) \approx I(x, y) + u \frac{\partial I}{\partial x} + v \frac{\partial I}{\partial y} + \text{高阶项} I(x+u,y+v)≈I(x,y)+u∂x∂I+v∂y∂I+高阶项
其中:
- ∂ I ∂ x \frac{\partial I}{\partial x} ∂x∂I 表示图像在 x x x 方向的梯度,记为 I x I_x Ix;
- ∂ I ∂ y \frac{\partial I}{\partial y} ∂y∂I 表示图像在 y y y 方向的梯度,记为 I y I_y Iy。
因此,我们可以将上式简化为:
I ( x + u , y + v ) ≈ I ( x , y ) + I x u + I y v I(x+u, y+v) \approx I(x, y) + I_x u + I_y v I(x+u,y+v)≈I(x,y)+Ixu+Iyv
这个式子告诉我们,当图像发生微小的平移时,像素值的变化可以通过图像梯度来近似表示。
3. 构造能量函数
在 Harris 角点检测中,关键思想是比较位移前后的像素强度差异,构造一个 能量函数 来度量这种差异。能量函数 E ( u , v ) E(u, v) E(u,v) 描述了图像在窗口 W W W 内的像素强度变化,它定义为:
E ( u , v ) = ∑ ( x , y ) ∈ W ω ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u, v) = \sum_{(x, y) \in W} \omega(x, y) \left[ I(x+u, y+v) - I(x, y) \right]^2 E(u,v)=(x,y)∈W∑ω(x,y)[I(x+u,y+v)−I(x,y)]2
其中:
-
ω ( x , y ) \omega(x, y) ω(x,y) 是一个权重函数,通常用于加权窗口内不同像素的影响。权重函数可以是均匀分布的矩形窗口,也可以是高斯加权窗口,如图片所示的两种形式。
- 矩形窗口:窗口内像素权重为 1,外部为 0;
- 高斯窗口:窗口内的像素权重按照高斯分布递减,使得靠近中心的像素有更大的影响。
代入泰勒展开的结果 I ( x + u , y + v ) ≈ I ( x , y ) + I x u + I y v I(x+u, y+v) \approx I(x, y) + I_x u + I_y v I(x+u,y+v)≈I(x,y)+Ixu+Iyv,能量函数可以近似表示为:
E ( u , v ) ≈ ∑ ( x , y ) ∈ W ω ( x , y ) [ I x u + I y v ] 2 E(u, v) \approx \sum_{(x, y) \in W} \omega(x, y) \left[ I_x u + I_y v \right]^2 E(u,v)≈(x,y)∈W∑ω(x,y)[Ixu+Iyv]2
这一步已经将图像的位移引入到了能量函数中,它通过计算窗口内像素的变化来判断图像的局部特性。
4. 向量乘法形式的能量函数
为了便于计算和进一步分析,我们可以将上述能量函数写成矩阵形式。先将 I x u + I y v I_x u + I_y v Ixu+Iyv 写成向量形式:
I x u + I y v = [ I x I y ] [ u v ] I_x u + I_y v = \begin{bmatrix} I_x & I_y \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} Ixu+Iyv=[IxIy][uv]
因此,能量函数 E ( u , v ) E(u, v) E(u,v) 可以写成:
E ( u , v ) = ∑ ( x , y ) ∈ W ω ( x , y ) [ u v ] [ I x 2 I x I y I x I y I y 2 ] [ u v ] E(u, v) = \sum_{(x, y) \in W} \omega(x, y) \begin{bmatrix} u & v \end{bmatrix} \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} E(u,v)=(x,y)∈W∑ω(x,y)[uv][Ix2IxIyIxIyIy2][uv]
进一步,我们定义一个称为 结构张量(M) 的矩阵:
M = ∑ ( x , y ) ∈ W ω ( x , y ) [ I x 2 I x I y I x I y I y 2 ] M = \sum_{(x, y) \in W} \omega(x, y) \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} M=(x,y)∈W∑ω(x,y)[Ix2IxIyIxIyIy2]
于是,能量函数可以简化为:
E ( u , v ) = [ u v ] M [ u v ] E(u, v) = \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix} E(u,v)=[uv]M[uv]
这就是 Harris 算子中能量函数的向量乘法形式,它为后续的特征值分析奠定了基础。
5. 特征值分析
我们通过特征值分解对结构张量 M M M 进行分析。这个张量 M M M 表示的是图像局部区域的梯度信息,它的特征值 λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 反映了不同方向上的强度变化。
- λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 是 M M M 的特征值,它们描述了图像在不同方向上的梯度变化程度。根据特征值的大小关系,我们可以判断局部区域的图像结构。
特征值分解可以写为:
M = R − 1 [ λ 1 0 0 λ 2 ] R M = R^{-1} \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix} R M=R−1[λ100λ2]R
其中, R R R 是旋转矩阵,用来将图像的局部梯度信息旋转到与特征值对应的方向上。
平坦区域:
- 如果 λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 都很小,表示在该区域内无论在哪个方向上图像的强度变化都非常小。这意味着该区域是平坦的,图像强度几乎不变。这种区域通常位于图像的背景或均匀纹理处。
- 如图中所示,梯度图的分布在平坦区域非常集中, λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 都接近零。
边缘区域:
- 如果 λ 1 \lambda_1 λ1 很大,而 λ 2 \lambda_2 λ2 很小,意味着该区域沿着一个方向(通常是边缘的方向)有较大的强度变化,而垂直于该方向的变化非常小。这种情况典型地表示 边缘区域 。
- 从梯度图中可以看出,在边缘区域,数据点呈现拉长的形状,意味着图像沿某一个方向(边缘方向)变化明显,而另一方向上的变化不显著。
角点区域:
- 如果 λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 都很大,表示图像在该区域内的各个方向都有较大的强度变化。这意味着无论图像在水平或垂直方向移动,都会导致显著的变化,因此可以认为该区域是角点。
- 角点区域在梯度图中显示为近似圆形的分布,表示在多个方向上都有显著的梯度变化。
7. Harris 响应函数
为了快速判断角点,Harris 引入了一个角响应函数:
θ = det ( M ) − α ⋅ trace ( M ) 2 \theta = \det(M) - \alpha \cdot \text{trace}(M)^2 θ=det(M)−α⋅trace(M)2
其中:
- det ( M ) = λ 1 λ 2 \det(M) = \lambda_1 \lambda_2 det(M)=λ1λ2 是矩阵的行列式,表示局部窗口中图像的总变化。
- trace ( M ) = λ 1 + λ 2 \text{trace}(M) = \lambda_1 + \lambda_2 trace(M)=λ1+λ2 是矩阵的迹,表示图像的总强度变化。
- α \alpha α 是经验常数,通常取 0.04 到 0.06。
通过计算这个响应函数 θ \theta θ,我们可以判断局部区域是否是角点:
- 角点(Corner):
当 λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 都较大时,说明图像的强度在 x x x 和 y y y 方向上都有明显的变化,即梯度变化较大。这种情况通常发生在角点或交叉点处。 - 边缘(Edge):
当 λ 1 \lambda_1 λ1 较大而 λ 2 \lambda_2 λ2 较小(或相反)时,说明图像在一个方向上有明显变化,而另一个方向上变化较小。此时,局部区域更可能是边缘。 - 平坦区域(Flat Region):
当 λ 1 \lambda_1 λ1 和 λ 2 \lambda_2 λ2 都较小时,说明图像在该区域内没有明显的强度变化(例如,在均匀的平坦区域)。此时,响应函数值 θ \theta θ 也会很小。
8. Harris 算子的优缺点
Harris 角点检测算法能够有效地检测出图像中的角点,并且对图像的 旋转具有较好的不变性 。然而,它也有一些局限性:
- 对尺度不变性较差:Harris 算法对图像缩放不敏感,因此对于不同尺度的图像角点检测效果不佳。
- 容易受到噪声影响:如果图像中存在较多噪声,梯度计算可能会受到干扰,导致角点检测结果不准确。
为了克服这些局限性,常常会将 Harris 角点检测与其他特征提取算法(例如 SIFT 或 SURF)结合使用,以提升检测的鲁棒性。