图像预处理—— 图像的变换与校正(理论)

整理范围:齐次坐标、平移/旋转/缩放、相似变换、仿射变换、投影变换


一、为什么要做"图像的变换与校正"

实际采集到的画面会因为相机位置、镜头畸变、拍摄角度等因素,与"理想中的画面"存在差异。

定义 :用数学建模方法描述图像的位置、大小、形状等已知条件 → 确定模型参数 → 根据模型对图像做几何校正。

把歪的、偏的、变形的图像"掰回"理想状态。


二、齐次坐标(Homogeneous Coordinate)

2.1 引入

普通二维坐标 (x,y)(x, y)(x,y) 只能表示 线性变换 (缩放、旋转),表示不了 平移(平移是加法,不是乘法)。

齐次坐标的做法:在二维向量末尾加一个 1,把 (x,y)(x, y)(x,y) 升级成三维向量 (x,y,1)(x, y, 1)(x,y,1)。这样 平移、旋转、缩放都能统一写成矩阵乘法。

2.2 基本形式

x1y11=M⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix} = M \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =M⋅ x0y01

其中 MMM 是一个 3×3 变换矩阵。所有几何变换都通过左乘这个矩阵完成。

末尾多一个 1,所有变换都变成矩阵乘法,方便编程实现。


三、三种基本几何变换

3.1 平移(Translation)

点 p0(x0,y0)p_0(x_0, y_0)p0(x0,y0) 沿 x 方向移 TxT_xTx、沿 y 方向移 TyT_yTy:

{x1=x0+Txy1=y0+Ty \begin{cases} x_1 = x_0 + T_x \\ y_1 = y_0 + T_y \end{cases} {x1=x0+Txy1=y0+Ty

矩阵形式:

x1y11=10Tx01Ty001⏟T⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{bmatrix}}_{T} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =T 100010TxTy1 ⋅ x0y01

平移参数 Tx,TyT_x, T_yTx,Ty 放在矩阵第三列。


3.2 旋转(Rotation)

点绕原点旋转 γ\gammaγ​ 角(逆时针为正):

{x1=x0cos⁡γ−y0sin⁡γy1=x0sin⁡γ+y0cos⁡γ \begin{cases} x_1 = x_0 \cos\gamma - y_0 \sin\gamma \\ y_1 = x_0 \sin\gamma + y_0 \cos\gamma \end{cases} {x1=x0cosγ−y0sinγy1=x0sinγ+y0cosγ

矩阵形式:

x1y11=cos⁡γ−sin⁡γ0sin⁡γcos⁡γ0001⏟R⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \end{bmatrix}}_{R} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =R cosγsinγ0−sinγcosγ0001 ⋅ x0y01

注意 :图像坐标系 y 轴向下时,顺时针/逆时针方向会反过来,实际代码中以 Halcon / OpenCV 的约定为准。

效果:图像绕原点旋转后,四角会露出黑色背景



3.3 缩放(Scaling)

x 方向缩放 SxS_xSx 倍,y 方向缩放 SyS_ySy 倍:

{x1=Sx⋅x0y1=Sy⋅y0 \begin{cases} x_1 = S_x \cdot x_0 \\ y_1 = S_y \cdot y_0 \end{cases} {x1=Sx⋅x0y1=Sy⋅y0

矩阵形式:

x1y11=Sx000Sy0001⏟S⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1 \end{bmatrix}}_{S} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =S Sx000Sy0001 ⋅ x0y01

  • Sx=Sy>1S_x = S_y > 1Sx=Sy>1:等比例放大(如 2 倍放大,3×3 网格变 6×6)
  • Sx=Sy<1S_x = S_y < 1Sx=Sy<1:等比例缩小(如 6×6 网格变 3×3)
  • Sx≠SyS_x \neq S_ySx=Sy:非等比例缩放(横向、纵向拉伸程度不同)

四、几何变换的层级体系

复制代码
平移(translation)
    ↓
欧氏变换(Euclidean) = 平移 + 旋转   (刚体变换,形状大小都不变)
    ↓
相似变换(similarity) = 平移 + 旋转 + 等比例缩放
    ↓
仿射变换(affine)     = 平移 + 旋转 + 缩放 + 切变
    ↓
投影变换(projective) = 直线仍映射为直线,但平行线不再平行

规律:越往下,保留的几何性质越少,能表达的变形越复杂


五、相似变换(Similarity Transformation)

5.1 定义

变换过程中 形状保持不变(大小、方向、位置可变)。

任何相似变换都可以分解为:等比例缩放 × 旋转 × 平移 的组合。

5.2 矩阵分解

x1y11=10xt01yt001⏟平移⋅cos⁡γ−sin⁡γ0sin⁡γcos⁡γ0001⏟旋转⋅s000s0001⏟等比例缩放⋅x0y01 \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} 1 & 0 & x_t \\ 0 & 1 & y_t \\ 0 & 0 & 1 \end{bmatrix}}{\text{平移}} \cdot \underbrace{\begin{bmatrix} \cos\gamma & -\sin\gamma & 0 \\ \sin\gamma & \cos\gamma & 0 \\ 0 & 0 & 1 \end{bmatrix}}{\text{旋转}} \cdot \underbrace{\begin{bmatrix} s & 0 & 0 \\ 0 & s & 0 \\ 0 & 0 & 1 \end{bmatrix}}_{\text{等比例缩放}} \cdot \begin{bmatrix} x_0 \\ y_0 \\ 1 \end{bmatrix} x1y11 =平移 100010xtyt1 ⋅旋转 cosγsinγ0−sinγcosγ0001 ⋅等比例缩放 s000s0001 ⋅ x0y01

5.3 分块形式

三个矩阵相乘后可以合并写成:

M=sRT01 M = \begin{bmatrix} sR & T \\ 0 & 1 \end{bmatrix} M=sR0T1

分块 尺寸 含义
sRsRsR 2×2 旋转 + 等比例缩放
TTT 2×1 平移向量
000 1×2 固定为 0, 0
111 1×1 固定为 1

整体仍是 3×3 矩阵,自由度为 4(缩放 1 个 + 旋转 1 个 + 平移 2 个)


六、仿射变换(Affine Transformation)

6.1 定义

变换过程中 保持直线和平行线不变(平行线映射后仍是平行线)。

任何仿射变换都可以分解为:缩放 + 平移 + 旋转 + 切变(Shearing) 的组合。

通俗理解:允许图形任意倾斜,并且允许在 x、y 两个方向上独立伸缩。

6.2 通用矩阵形式

x′y′1=abcdef001⏟M⋅xy1 \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix}= \underbrace{\begin{bmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{bmatrix}}_{M} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x′y′1 =M ad0be0cf1 ⋅ xy1

  • 最后一行固定为 [0, 0, 1]
  • 前两行有 6 个未知参数(a, b, c, d, e, f)
  • 自由度为 6,需要 3 对不共线的点 才能求解

6.3 常见仿射变换子类型

变换类型 矩阵(前两行示意) 效果
恒等 Identity [1 0 0; 0 1 0] 图像不变
平移 Translation [1 0 X; 0 1 Y] 整体移动 (X, Y)
旋转 Rotation [cosθ sinθ; -sinθ cosθ] 形式 绕原点转 θ 角
等比例缩放 Isotropic Scaling [s 0 0; 0 s 0] x、y 同比例缩放
非等比例缩放 Scaling [W 0 0; 0 H 0] x 方向宽 W,y 方向高 H
反射 Reflection 带 -1 元素 关于原点/x轴/y轴对称翻转
切变 Shear 带 tanφ 元素 图形倾斜(平行四边形化)

6.4 切变(Shearing)详解

切变是仿射变换相比相似变换 多出来的能力,分为两种:

x 方向切变 (图形沿 x 方向倾斜 φ 角):

Mx=1tan⁡ϕ0010001 M_x = \begin{bmatrix} 1 & \tan\phi & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} Mx= 100tanϕ10001

  • 效果:原来的点 (1,0)(1, 0)(1,0) 仍在原地,点 (0,1)(0, 1)(0,1) 被推到 (tan⁡ϕ,1)(\tan\phi, 1)(tanϕ,1)
  • 平行线仍然平行,但矩形变成平行四边形

y 方向切变(图形沿 y 方向倾斜 ψ 角):

My=100tan⁡ψ10001 M_y = \begin{bmatrix} 1 & 0 & 0 \\ \tan\psi & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} My= 1tanψ0010001

6.5 反射(Reflection)三种形式

反射类型 矩阵 效果
关于原点反射 [-1 0 0; 0 -1 0; 0 0 1] 上下左右都翻转
关于 x 轴反射 [1 0 0; 0 -1 0; 0 0 1] 上下翻转
关于 y 轴反射 [-1 0 0; 0 1 0; 0 0 1] 左右翻转

七、投影变换(Projective Transformation)

7.1 定义

变换过程中 直线仍然映射为直线,但不再保证平行线平行。

  • 二维投影变换:用 3×3 可逆矩阵 表示
  • 三维投影变换:用 4×4 可逆矩阵 表示

7.2 例子

现实中两条铁轨是平行的,但在照片中会向远处汇聚到一个消失点------这就是投影变换的效果(平行线不再平行)

7.3 矩阵形式(二维)

M=m11m12m13m21m22m23m31m32m33 M = \begin{bmatrix} m_{11} & m_{12} & m_{13} \\ m_{21} & m_{22} & m_{23} \\ m_{31} & m_{32} & m_{33} \end{bmatrix} M= m11m21m31m12m22m32m13m23m33

  • 与仿射变换的区别:最后一行不再是 0, 0, 1 ,m31,m32m_{31}, m_{32}m31,m32 可以不为零
  • 自由度为 8(3×3 矩阵有 9 个元素,但齐次坐标下整体缩放不产生新变换)
  • 需要 4 对点 才能求解

八、三种变换对比

对比项 相似变换 仿射变换 投影变换
保持直线 ✅ ✅ ✅
保持平行线 ✅ ✅ ❌
保持形状 ✅ ❌(可切变、非等比缩放) ❌
可分解为 等比缩放 + 旋转 + 平移 缩放 + 旋转 + 平移 + 切变 更一般的 3×3 矩阵
矩阵形式 [sR T; 0 1] [a b c; d e f; 0 0 1] 任意 3×3 可逆矩阵
自由度 4 6 8
求解需要点数 2 对 3 对不共线 4 对
典型应用 图像平移、旋转、缩放 矫正倾斜、车牌校正 透视畸变校正、广角镜头去畸变

九、主要矩阵

9.1 矩阵形式汇总

变换 矩阵 M
平移 10Tx01Ty001\begin{bmatrix}1&0&T_x\\0&1&T_y\\0&0&1\end{bmatrix} 100010TxTy1
旋转 cos⁡γ−sin⁡γ0sin⁡γcos⁡γ0001\begin{bmatrix}\cos\gamma&-\sin\gamma&0\\\sin\gamma&\cos\gamma&0\\0&0&1\end{bmatrix} cosγsinγ0−sinγcosγ0001
缩放 Sx000Sy0001\begin{bmatrix}S_x&0&0\\0&S_y&0\\0&0&1\end{bmatrix} Sx000Sy0001
相似 scos⁡γ−ssin⁡γTxssin⁡γscos⁡γTy001\begin{bmatrix}s\cos\gamma&-s\sin\gamma&T_x\\s\sin\gamma&s\cos\gamma&T_y\\0&0&1\end{bmatrix} scosγssinγ0−ssinγscosγ0TxTy1
仿射 abcdef001\begin{bmatrix}a&b&c\\d&e&f\\0&0&1\end{bmatrix} ad0be0cf1
投影 m11m12m13m21m22m23m31m32m33\begin{bmatrix}m_{11}&m_{12}&m_{13}\\m_{21}&m_{22}&m_{23}\\m_{31}&m_{32}&m_{33}\end{bmatrix} m11m21m31m12m22m32m13m23m33

9.2 解题思路(求校正参数)

  1. 找已知对应点:在原图和理想图上各取若干对应点
  2. 列方程:每对点提供 2 个方程(x 方向、y 方向各一个)
  3. 解矩阵 :
    • 相似变换:2 对点
    • 仿射变换:3 对点
    • 投影变换:4 对点
  4. 重映射:用求得的矩阵对每个像素做坐标变换,得到校正后图像

十、易混点

  1. 齐次坐标为什么加 1? ------ 为了把平移也写成矩阵乘法,统一所有变换的表示形式。
  2. 相似 vs 仿射的本质区别 ------ 相似只能"等比例缩放 + 旋转 + 平移",图形形状不变;仿射还能切变、x/y 独立伸缩,矩形可以变平行四边形。
  3. 仿射 vs 投影的本质区别 ------ 仿射保持平行关系(平行线还是平行线);投影不保证平行。
  4. 旋转矩阵的符号 ------ 取决于 y 轴方向(数学 y 向上 / 图像 y 向下),实际编程时以库函数为准,不要死记正负号。
  5. 自由度与点数关系 ------ 自由度越高,能表达的变形越复杂,但需要的已知点也越多。
相关推荐
ck0135791 小时前
AI 图片放大原理与实践:2 倍、4 倍放大有什么区别?
图像处理·人工智能·深度学习·计算机视觉
nmjkhome1 小时前
26 疲劳的几个重要概念(第51课)-solid works simulation
学习
程序猿乐锅1 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
燕落南枝1 小时前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html
星恒随风13 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式
qq_2842740513 小时前
数控机床编程基础与坐标系:编程六步流程、程序号/程序段/程序字格式,与右手定则下车床铣床XYZ轴判定(含考点)
笔记·学习·自动化·制造
德林恩宝13 小时前
On-Policy Distillation(OPD)学习文档
人工智能·学习·机器学习·大模型·llm·大模型微调
a puppy slide 葱13 小时前
ENAS | 基于参数共享的高效神经网络架构搜索
论文阅读·人工智能·深度学习·神经网络·机器学习·计算机视觉·神经网络架构搜索
xxwl58513 小时前
区域赛分类题解
c++·笔记·学习·算法