投影变换是计算机视觉中用于描述两幅图像之间平面到平面的映射关系的一种变换。数学上,2D 投影变换由一个 3×3 的矩阵 H 表示,定义为:
x' ~ Hx
其中,x = [x, y, 1]^T 和 x' = [x', y', 1]^T 是两幅图像上对应的点(以齐次坐标表示),~ 表示等价(忽略尺度因子)。H 是一个 3×3 的矩阵,包含 9 个元素,但由于齐次坐标的尺度无关性,实际自由度为 8。
为了估计 H,通常需要至少 4 对对应点(每对点提供 2 个线性约束)。DLT(直接线性变换)和 SVD(奇异值分解)是解决这一问题的两种关键方法。
DLT 是一种直接求解 H 的线性方法。它通过将投影变换的方程重写为一个线性系统来求解 H 的元素。
对于一对对应点 (x_i, x'_i),即 ([x_i, y_i, 1]^T, [x'_i, y'_i, 1]^T),投影变换满足:
将 H 展开为一个 9 维向量 h = [h_1, h_2, ..., h_9]^T,并利用交叉乘积表示投影关系 x'_i × (Hx_i) = 0,可以得到以下线性方程:
每个点对提供 2 个线性方程。对于 n ≥ 4 对点,构造一个 2n × 9 的矩阵 A,使得:
Ah = 0
由于 H 的尺度无关性,通常约束 ||h|| = 1,并通过解这个齐次线性方程组来估计 h。
DLT 直接通过线性代数方法求解 Ah = 0。通常,这需要找到 A 的右零空间(right null space),即 A 的一个非零向量 h。这正是 SVD 发挥作用的地方。
SVD 是一种矩阵分解方法,将任意 m × n 矩阵 A 分解为:
A = U Σ V^T
其中:
在 DLT 问题中,A 是一个 2n × 9 的矩阵。SVD 的右奇异向量(V 的列)对应于 A 的右零空间。当 A 的秩为 8 时,V 的最后一列(对应于最小的奇异值,通常接近 0)就是 h 的解。
在 DLT 中,SVD 用于求解 Ah = 0。具体步骤为:
| 方面 | DLT | SVD |
|---|---|---|
| 定义 | 一种求解投影变换 H 的线性方法,通过构造线性方程组 Ah = 0。 | 一种通用的矩阵分解方法,用于分解任意矩阵并提取其零空间。 |
| 作用 | 提供问题建模,将投影变换问题转化为线性方程组。 | 提供数值解法,用于求解 DLT 构造的线性方程组。 |
| 适用范围 | 专用于投影变换等齐次线性方程的求解。 | 通用方法,适用于线性代数中的多种问题(如 PCA、最小二乘、零空间求解等)。 |
| 输出 | 构造的线性方程组 Ah = 0。 | 分解结果 U Σ V^T,用于提取 h。 |
findHomography 函数内部就使用 DLT 构造矩阵,并通过 SVD 求解 H。