# 边缘检测(Edge Detection)

边缘是图像中亮度变化剧烈的区域,是图像最基本的特征之一。边缘检测旨在识别这些区域,通常包括以下步骤:

# 边缘检测器

边缘检测通常始于对图像进行平滑处理,以减少噪声影响。边缘的特征可以用梯度来描述:

  • 大小(幅度):梯度的范数(L2 范数),表示亮度变化的剧烈程度。
  • 方向θ=arctan2(dy,dx)\theta = \arctan2(-dy, dx),表示亮度变化的方向。

边缘检测的基本条件是梯度幅度大于某个阈值。然而,这种简单的阈值处理可能导致边缘过厚,且阈值选择不当容易使边缘变得不连续。

# 非极大值抑制(Non-Maximum Suppression, NMS)

为了解决边缘过厚和不连续的问题,非极大值抑制被引入。其核心思想是只保留沿梯度方向上的局部最大值。具体操作如下:

  • 对于每个梯度幅度高于阈值的像素点 q,检查其沿梯度方向上的两个相邻点 p 和 r。
  • 如果点 q 的梯度幅度小于 p 或 r 的梯度幅度,则抑制点 q(将其值设为0)。
  • 为了获得更精确的梯度幅度值,p 和 r 处的幅度通常需要通过插值来计算。

# 滞后抑制(Hysteresis Thresholding)

滞后抑制是一种双阈值处理方法,旨在进一步优化边缘的连续性,并减少假边缘。

  • 高阈值:用于识别强边缘点。如果一个点的梯度幅度大于高阈值,它被认为是可靠的真实边缘,并直接标记为边缘点。
  • 低阈值:用于延续边缘曲线。如果一个点的梯度幅度介于低阈值和高阈值之间(被称为弱边缘点),则检查它是否与任何强边缘点相邻(通常通过 8-连通性检查)。
  • 如果弱边缘点与强边缘点相连,则将其也标记为边缘点;否则,将其忽略。这样可以确保只有真正属于边缘的弱点被保留下来,从而形成连续的边缘线。

# 角点检测(Corner Detection)

角点是图像中亮度在多个方向上都发生剧烈变化的区域,是图像的关键特征点。

# 关键点提取的意义

全景拼接等应用通常需要提取关键点,然后进行特征匹配图像对齐。关键点提取的优势在于:

  • 紧凑性与效率:关键点数量远少于图像像素,处理效率高。
  • 局部性:关键点代表图像中的小区域,对杂乱和遮挡具有鲁棒性。
  • 显著性:每个关键点都应具有独特的描述符,易于区分。
  • 可重复性:在不同的图像中(即使存在几何或光度变换)也能找到相同的关键点。

# 角点检测的基本原理

角点检测的核心思想是:以任何方向移动一个窗口都会引起强烈的亮度变化

E(u,v)=(x,y)W(I(u+x,v+y)I(x,y))2E(u, v) = \sum_{(x, y)\in W} (I(u + x, v + y) - I(x, y))^2

该公式计算了当窗口移动 (u,v)(u,v) 距离时,窗口内像素亮度变化的平方和。其中,WW 表示窗口,对窗口求和可使用高斯卷积核进行加权,以突出中心像素。

# 二阶近似与自相关矩阵

为了提高计算效率,上述公式通常通过泰勒级数进行二阶近似:

E(u,v)[uv]M[uv]E(u, v) \approx \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix}

其中 MM自相关矩阵(或结构张量),它是一个局部算子,只需计算一次:

M=[Ix2IxIyIxIyIy2]M = \begin{bmatrix} \sum I_x^2 & \sum I_x I_y \\ \sum I_x I_y & \sum I_y^2 \end{bmatrix}

这里 IxI_xIyI_y 分别是图像在 x 和 y 方向的梯度。

# 角点判别条件

通过分析自相关矩阵 MM特征值 λ1\lambda_1λ2\lambda_2 可以判断像素点的类型:

  • 角点:若 λ1\lambda_1λ2\lambda_2 均很大,则 E(u,v)E(u,v) 在任何方向的移动都会产生强烈的亮度变化。
  • 边缘:若 λ1\lambda_1 大而 λ2\lambda_2 小,或反之,则 E(u,v)E(u,v) 仅在一个方向上发生剧烈变化。例如,若 λ1λ2\lambda_1 \gg \lambda_2,则为沿垂直方向的边界。
  • 平坦区域:若 λ1\lambda_1λ2\lambda_2 均很小,则 E(u,v)E(u,v) 在任何方向的移动变化都很小。

# Harris 判别公式

为了避免直接计算特征值,Harris 引入了响应函数来简化判别:

Harrris(M^)=det(M^)αtr2(M^)=λ1λ2α(λ1+λ2)2\text{Harrris}(\hat M) = \det(\hat M) - \alpha \text{tr}^2(\hat M) = \lambda_1 \lambda_2 - \alpha (\lambda_1 + \lambda_2)^2

  • M^\hat MMM 的高斯加权版本。
  • det(M^)\det(\hat M) 代表特征值的乘积,tr(M^)\text{tr}(\hat M) 代表特征值的和。
  • α\alpha 是经验常数,通常取值在 0.04 到 0.06 之间。

通过 Harris 响应函数的值可以进行判断:

  • 大于阈值:认为是角点
  • 接近 0:认为是平坦区域
  • 负值:认为是边缘

为了确保角点的唯一性,通常也会结合非极大值抑制来移除局部非最大值。

# Harris 角点的特性

  • 对强度变化是协变的:因为使用了导数。
  • 对平移是协变的:因为导数和卷积都具有平移不变性。
  • 对旋转是协变的:因为特征值在旋转后保持不变。
  • 对尺度不协变:Harris 角点检测依赖于固定的窗口大小,因此无法在不同尺度上找到相同的角点。

# 光流估计(Optical Flow Estimation)

光流是图像中亮度模式的表观运动。理想情况下,光流应该与场景中物体的实际运动场相同,但表观运动也可能由亮度变化而非实际运动引起。

# Lucas-Kanade 算法

Lucas-Kanade 算法是一种常用的光流估计方法,其核心建立在以下三个基本假设之上:

  • 亮度不变性:同一个物体或点的投影在连续帧中的亮度保持不变,即 I(x,y,t)=I(x+u,y+v,t+Δt)I(x, y, t) = I(x + u, y + v, t + \Delta t)
  • 微小移动:点的移动距离很小,可以忽略高阶项。
  • 空间一致性:一个像素点周围的邻域内的所有点都具有相似的运动。

# 光圈问题(Aperture Problem)

根据亮度不变性和微小移动假设,可以利用泰勒级数展开得到光流方程:

Ixu+Iyv+It=0I_x u + I_y v + I_t = 0

其中 IxI_x, IyI_y, ItI_t 分别是图像在 x、y 和时间 t 上的梯度,(u,v)(u, v) 是像素点的光流向量。这是一个一个方程,两个未知数的问题,无法直接求解。

这种困境被称为光圈问题:仅凭一个像素点的信息,无法确定其完整运动方向。例如,观察一根穿过小孔的柱子,只能感知到沿边缘方向的运动,而无法确定其垂直于边缘的运动。

# 空间一致性约束与最小二乘解

为了解决光圈问题,Lucas-Kanade 算法引入了空间一致性假设。它认为一个像素邻域内的所有点都具有相同的光流 (u,v)(u, v)。这使得我们可以在一个窗口内收集多个方程,形成一个线性最小二乘问题

[Ix(1)Iy(1)Ix(2)Iy(2)Ix(n)Iy(n)][uv]=[It(1)It(2)It(n)]\begin{bmatrix} I_x(1) & I_y(1) \\ I_x(2) & I_y(2) \\ \vdots & \vdots \\ I_x(n) & I_y(n) \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} = -\begin{bmatrix} I_t(1) \\ I_t(2) \\ \vdots \\ I_t(n) \end{bmatrix}

这个方程组可以利用最小二乘法求解,得到光流向量 (u,v)(u, v) 的封闭解:

[uv]=[Ix2IxIyIxIyIy2]1[IxItIyIt]\begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} \sum I_x^2 & \sum I_x I_y \\ \sum I_x I_y & \sum I_y^2 \end{bmatrix}^{-1} \begin{bmatrix} -\sum I_x I_t \\ -\sum I_y I_t \end{bmatrix}

# Lucas-Kanade 算法的局限性

当上述假设不成立时,Lucas-Kanade 算法会失效:

  • 运动较大:当移动距离大于一个像素时,微小移动假设不成立。解决方法包括多分辨率金字塔(处理大运动)和迭代精化
  • 运动不一致:当邻域内的点运动不同时,空间一致性假设不成立。这通常需要使用运动分割等更复杂的算法。
  • 亮度变化:当亮度不变性假设不成立时(如光照变化),可以考虑使用机器学习方法来解决。