2.3 几何变换


2.3 几何变换

本节摘要:SOURCE 2.3:平移、旋转、缩放、仿射、透视由变换矩阵实现。本节动手 getRotationMatrix2DwarpAffinegetPerspectiveTransform 做文档扫描矫正模拟。

本节地图

  1. 构造 2×3 仿射与 3×3 透视矩阵
  2. 实现旋转不变裁剪(expand bbox)
  3. 透视变换矫正梯形文档

一、仿射变换

import cv2, numpy as np h, w = img.shape[:2] M = cv2.getRotationMatrix2D((w/2, h/2), 45, 1.0) rot = cv2.warpAffine(img, M, (w, h)) # 缩放 M2 = cv2.getRotationMatrix2D((0,0), 0, 0.5) small = cv2.warpAffine(img, M2, (w//2, h//2))

三点对应:cv2.getAffineTransform(src_pts, dst_pts)

二、透视变换

扫描件四角 → 矩形:

pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M = cv2.getPerspectiveTransform(pts1, pts2) warped = cv2.warpPerspective(img, M, (300,300))

几何变换类型

几何变换类型

几何变换类型

三、插值

INTER_LINEAR 默认;放大用 INTER_CUBIC;二值掩膜用 INTER_NEAREST

四、实验

  1. 旋转 30° 并计算有效区域 bbox
  2. 用手机拍倾斜矩形,手动点四点做透视矫正
  3. 对比最近邻与双线性旋转锯齿

⚠️ 常见坑:旋转后未改输出尺寸导致裁切 — 计算新 bbox 或扩大 canvas。

💡 关键直觉:特征匹配后的图像对齐靠仿射/单应矩阵。

要点串联

  • 仿射 6 自由度,透视 8 自由度
  • warpAffine / warpPerspective 是核心 API
  • 插值方法影响边缘质量
  • 文档扫描是透视变换标准应用

第 3 章进入卷积滤波与 FFT。

从矩阵到变换:仿射与透视的区别

几何变换的统一表达是矩阵运算:新坐标 = 变换矩阵 × 原坐标。仿射变换是 2×3 矩阵,含 6 个自由度(平移 2、旋转 1、缩放 2、剪切 1),保持直线和平行性——平行线变换后仍平行;透视变换是 3×3 矩阵,含 8 个自由度,不保持平行性,能把梯形映射回矩形。这个区别决定了适用范围:仿射适合"整体旋转缩放平移"(相机角度近似固定时),透视适合"三维平面投影"(拍歪了的文档、路面标线)。判断用哪个,就看原图中平行线是否还该保持平行。

import cv2, numpy as np # 仿射:由 3 对对应点求解 src = np.float32([[50,50],[200,50],[50,200]]) dst = np.float32([[10,100],[200,50],[100,250]]) M_aff = cv2.getAffineTransform(src, dst) # 透视:由 4 对对应点求解 pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M_per = cv2.getPerspectiveTransform(pts1, pts2)

插值:变换后的像素从哪里来

变换本质是"反向映射加插值":目标图像的每个像素,用逆变换找它在原图的位置,再在该位置周围插值。最近邻直接取最近像素,速度快但边缘呈锯齿;双线性用 2×2 邻域加权平均,平滑但轻微模糊,是默认选择;三次插值用更大邻域,质量更高但更慢。选择经验:放大用双三次、二值掩膜必须用最近邻(双线性会在 0/1 之间产生灰色过渡像素)、一般场景用双线性即可。

变换与对齐:特征匹配的下游

几何变换的典型应用是图像配准:两张拍摄角度不同的照片,用特征匹配(第 5 章)找到对应点,再由对应点解出变换矩阵,把一张图变换到另一张图的坐标系下。文档扫描矫正、全景拼接、双目视差对齐都依赖这条链路。工程上要注意"外参"的概念——固定机位的相机相对世界坐标的姿态就是一组固定的旋转和平移,标定外参后可以预先计算变换矩阵,实时只做 warp,这在工业视觉里是标准做法。

实验提醒:旋转 45 度后如果仍用原尺寸输出,四角会超出画布被裁掉。处理办法是先计算旋转后新矩形的边界,扩大画布再旋转;或先平移到画布中心。这个"旋转裁边"问题是最常见的实战坑,一定要亲手复现一次才能记住。

透视变换的应用价值在文档处理领域尤其突出:手机拍身份证、合同、黑板,都是先找四角(或四条边),再透视矫正成正面矩形。理解"四点定矩阵、warp 得正视图"这条流程,你已经掌握了一个能直接落地的实用技能。

最后把坐标约定再强调一次:OpenCV 所有变换矩阵和点的坐标都是 (x, y),x 是列、y 是行,与数组下标 img[y, x] 的顺序相反。构造点集和读回结果时反复对照这个约定,可以避免绝大多数几何变换的坐标系错误。本节核心是"变换矩阵思想":图像的一切几何操作(平移、旋转、缩放、裁剪、矫正)都能统一成矩阵运算,这也是后续单应矩阵、相机投影矩阵等概念的基础。把这节学透,特征匹配章节的单应矩阵理解会非常顺畅。

补一个数学视角:仿射和透视变换都可以用齐次坐标统一表达——二维点 (x,y) 写成 (x,y,1),变换矩阵是 3×3,两次变换可以用矩阵乘法合并成一次,避免逐次变换的插值误差累积。这在需要"先旋转再平移再缩放"的复合变换里很实用:先把三个矩阵乘好,再一次性 warp。图像拼接(第 5 章)里的单应矩阵 H 就是这种 3×3 齐次矩阵。另外,warp 的默认输出尺寸要和变换匹配,插值方法、边界模式也影响结果质量,做精配准时(如文档 OCR 前矫正)建议用双三次插值。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U