返回

透视变换

Perspective Transform
第二章 / 图像校正
参数面板

先拖动左图四个控制点贴合纸张边界;当前点对只用于解透视矩阵,再对比透视结果与仿射结果的差别。

透视校正需要保持 A-B-D-C 四点构成凸四边形。拖动时如果点序发生交叉,会保留上一组有效位置。
透视矩阵由四点决定;仿射矩阵只由前三点决定,因此残差大小可以直接反映两者能力差异。
概念说明

透视变换校正什么

透视变换通过对应点把斜视平面映射到目标平面。图源:scikit-image geometric transform 示例
任务

当相机斜对着一张纸、路面或墙面拍摄时,原本矩形的平面在图像里会变成梯形或任意凸四边形。如果直接做仿射校正,四个角无法同时对齐,需要引入能描述近大远小的投影变换。

思路

常用的处理办法是先在原图和目标正视图上各标出四个对应角点,用这八组坐标求解一个 3×3 齐次矩阵;得到矩阵后,对输出图像的每个像素反查原图位置并插值采样;也可以和仿射变换对比,体会前三点与四点约束的差别。

观察

拖动左图 A-D 四个控制点,观察透视结果和仿射结果的变化:当四点构成明显梯形时,透视结果能把平面展开成矩形,而仿射结果在第四角会留下残差。

透视变换只解决一个问题

同一平面在不同视角下会形成不同的四边形投影。透视变换用四对对应点建立一个 3×3 齐次矩阵, 把倾斜拍摄的平面重新映射为正视图。它保持直线性,但不保持平行性。

四对点确定透视矩阵,随后对整幅图执行重采样。
输入图像:斜拍文档平面

第一步是建立两幅图像的透视变换方程;示例先用四个角点描述同一平面在当前视角下的位置。

232×176
在左图拖动 A-D 四点,模拟文档扫描时的角点定位
当前选中:A 左上角
透视校正结果

四个角同时与目标矩形对齐,更接近文档扫描或平面展开的真实需求。

四点全部参与
透视矩阵同时约束四个角,因此能把梯形平面展开为矩形正视图。
仿射校正结果

A、B、C 三点可以重合,但 D 点只能被“预测”,因此难以消除透视汇聚。

第四角残差 65.31
仿射变换保留平行性,适合弱透视场景;遇到明显斜拍时,第四个角的误差会直接暴露出来。
1. 建立四对点对应

左图四个控制点对应拍摄到的平面角点,右侧目标平面固定为一个矩形。每一对点都在说明”同一平面上的同一位置,在两个视角下分别落到哪里”。

当前控制点:A 左上角
控制点四边形保持凸包顺序,才能稳定对应同一平面边界。
2. 由对应点求变换矩阵

透视变换使用四对点,得到 3×3 齐次矩阵;仿射变换只使用前三对点,得到的 3×3 矩阵第三行为 [0,0,1]。 两者都保留直线,但只有透视矩阵能补偿斜拍造成的汇聚关系。

控制点中心尺度因子 ω=1.4534
仿射矩阵只由前三点确定,因此第四个角点只能被近似预测。
3. 扩展到整个平面

求得矩阵后,图像中的每个像素都按该矩阵重投影。透视校正能让四个角同时对齐,仿射校正只能让前三点准确重合,第四个角会留下残差。

透视结果输出为 168×120 的正视图
仿射第四角残差约为 65.31 像素
公式与关键结论

透视变换强调四对点、3×3 矩阵、直线性保留与平行性不保留。

透视变换
ω[xy1]=[t11t12t13t21t22t23t31t32t33][xy1]
t31、t32 描述透视失真;它们为 0 时,矩阵会退化为仿射形式。
仿射变换
[xy1]=[a11a12t1a21a22t2001][xy1]
仿射变换保留平行性,因此它无法完全纠正斜拍平面带来的汇聚现象。
四对点坐标与变换矩阵
当前四点坐标
A左上角,坐标 (58, 30)
B右上角,坐标 (184, 24)
C左下角,坐标 (36, 150)
D右下角,坐标 (206, 160)
当前选中点
pA = [ xA yA 1 ] = [58301]
当前选中 A 点,方向键会以 1 像素为单位微调该点。
目标矩形对应点
p′A = [ x′A y′A 1 ] = [001]
四个目标点固定在正视矩形的四个顶点。
当前透视矩阵 T
T = [t11t12t13t21t22t23t31t32t33] = [1.7390.319-110.4180.0741.554-50.8980.00120.00341]
透视矩阵使用四对点,等价于 3×3 齐次矩阵。
仿射矩阵只使用前三对点,因此第四个角点不会被强制对齐。
当前控制点中心透视代入
ω pdst = T psrc = [1.7390.319-110.4180.0741.554-50.8980.00120.00341] [121911] = ω[88.868.41] ,ω=1.4534
取四个控制点的中心作为示例点;透视变换先得到齐次坐标,再除以尺度因子 omega 得到真正的像素坐标。
当前仿射矩阵 A
A = [a11a12t1a21a22t2001] = [1.3370.245-84.9040.04761-32.775001]
由 A、B、C 三点决定。用它预测 D 点时,坐标约为 (229.8, 137.1)。
当前 D 点仿射预测
pdst = A psrc = [1.3370.245-84.9040.04761-32.775001] [2061601] = [229.8137.11]
仿射矩阵没有透视尺度项,因此第四点只能被前三点确定的模型预测。
为什么透视变换需要四对点

3×3 齐次矩阵共有 9 个元素,但整体只差一个比例因子,因此有效自由度是 8。 一对点给出两个独立方程,四对点正好提供 8 个约束,所以求解过程和 OpenCV 实现都要求使用四对点。

约束数量
4 对点 8 个方程 8 个自由度
三对点只够求仿射矩阵,因为仿射矩阵只含 6 个自由度。
为什么文档扫描和车道校正常用透视变换

这类任务都近似处理“同一平面”:纸张表面、路面、棋盘格平面都可以看作二维平面。只要找到四个稳定角点,就能把斜拍视角重新拉回到近似正视图。

文档扫描:把梯形纸张校正为矩形版面,便于 OCR 和排版分析。
车道线校正:把斜前方路面变成俯视平面,便于测量车道宽度和偏移量。