几何变换与图像插值

入门01-图像与基础处理预计 15 分钟几何变换仿射插值齐次坐标

前置知识点

kp-001 图像的数字化表示与色彩空间

一句话定义

几何变换用矩阵把像素坐标从一个平面映射到另一个平面(平移、旋转、缩放、透视),插值则回答「新坐标落在非整数位置时亮度取多少」。

为什么重要

数据增强的随机裁剪旋转、文档扫描的透视校正、全景拼接的单应 warp、相机标定后的去畸变,底层全是几何变换 + 插值;它是贯穿传统视觉与深度学习数据管线的公共底座。

直观类比

变换矩阵像一张透明坐标网格纸,把原图网格任意拉扯旋转;插值则是问「网格纸上的空白格该填什么颜色」——最近邻是把最近的格子抄过来,双线性是按距离给四个邻居加权平均。

前置知识

kp-001(像素坐标约定);库外线性代数的矩阵乘法与齐次坐标概念。

核心概念

原理与机制

仿射变换把旋转、缩放、剪切、平移统一为 2×3 矩阵作用于齐次坐标;透视投影变换(单应)把世界平面上一点映射到另一平面,是最一般的 2D 平面到平面变换。实现时对每个输出像素 (x′, y′) 施加逆矩阵 A⁻¹ 得到原图坐标 (x, y),x、y 常为小数,再用插值从四个整数邻点加权求和;权重即到各邻点的距离乘积。变换链可合并:先做三次变换再插值一次,优于逐次变换逐次插值(减少重复模糊)。

公式与模型

[ x′ ] [ a11 a12 tx ] [ x ] [ y′ ] = [ a21 a22 ty ] [ y ] [ 1 ] [ 0 0 1 ] [ 1 ] (仿射,6 自由度)
[ x′ ] [ h11 h12 h13 ] [ x ] [ y′ ] ~ [ h21 h22 h23 ] [ y ] (单应,8 自由度,~ 表示齐次缩放) [ 1 ] [ h31 h32 h33 ] [ 1 ]

双线性插值:

I(x, y) ≈ (1−dx)(1−dy)·I(x0, y0) + dx(1−dy)·I(x0+1, y0) + (1−dx)dy·I(x0, y0+1) + dx·dy·I(x0+1, y0+1)

图示

原图 仿射:网格保持平行 透视:仅保持直线 旋转 = 2×2 旋转阵;平移靠齐次坐标并入矩阵

实例与案例

文档扫描:手机斜拍 A4 纸,检测四个角点后 getPerspectiveTransform 求单应并 warpPerspective 拉正为标准比例。训练增强:cv2.warpAffine 做随机旋转 ±10 度 + 平移,标签框也要按同一矩阵变换(kp-026 展开此坑)。全景拼接:相邻两图的特征匹配(kp-009)估计单应,把第二张图 warp 进第一张的坐标系。

import cv2, numpy as np
M = cv2.getRotationMatrix2D(center=(w/2, h/2), angle=15, scale=1.0)
rot = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_LINEAR)
H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)
rectified = cv2.warpPerspective(img, H, (out_w, out_h))

常见误区

与其他知识点的关系

kp-009 用匹配点估计单应矩阵;kp-010 的相机投影是单应的「三维版」;kp-011 去畸变本质是每像素的非线性几何映射。

自测题

  1. 仿射变换有几个自由度?需要几对点唯一确定?

答案要点:6 个;每对点给 2 个方程,至少 3 对点。

  1. 为什么实现时用逆向映射而不是前向映射?

答案要点:前向映射会让多个源像素落到同一目标格且部分目标格无人认领(空洞);逆向映射保证每个输出像素都能找到输入值。

  1. 放大 4 倍图片,最近邻与双线性的视觉差异是什么?

答案要点:最近邻出现块状锯齿,双线性平滑但偏糊;双三次或超分网络效果更好。

延伸阅读

相关知识点

kp-010 针孔相机模型与投影kp-009 匹配稳健化:RANSAC 与单应估计