OpenCV基础教学(十二):图像透视变换基础
透视变换是图像处理中的一项重要技术,能够校正图像的视角,本文将详细介绍其基本原理和OpenCV实现方法。
总流程图:

一、透视变换的基本概念
1.1 什么是透视变换?
透视变换(Perspective Transformation)是一种二维平面到二维平面的投影变换,也称为单应性变换(Homography Transformation)。它能够改变图像的观察视角,矫正因拍摄角度造成的透视畸变。
简单理解:就像你从侧面看一张卡片,卡片会显得倾斜变形,透视变换就是把这个倾斜的视图"扶正",变成正面视角。
1.2 透视变换的应用
- 文档扫描:将倾斜拍摄的文档变成正面视图
- 车牌识别:校正倾斜的车牌图像
- 图像拼接:将不同视角的图像对齐
- AR增强现实:将虚拟物体正确投影到现实场景
二、透视变换的数学基础
2.1 变换矩阵
透视变换使用一个3×3的矩阵来表示:
[a11 a12 a13]
[a21 a22 a23]
[a31 a32 1 ]
由于是齐次坐标,通常将最后一个元素设为1,所以实际上有8个自由度。
2.2 坐标变换公式
对于原图像中的点(x,y),变换后的坐标(x',y')计算公式为:
x' = (a11*x + a12*y + a13) / (a31*x + a32*y + 1)
y' = (a21*x + a22*y + a23) / (a31*x + a32*y + 1)
三、OpenCV透视变换基础实现


3.1 基本代码示例
python
import cv2
import numpy as np
# 1. 读取图片
image_np = cv2.imread('./test.png')
# 获取图像的大小
img_shape = image_np.shape # 返回(高度, 宽度, 通道数)
# 2. 定义原始图像中的四个点(四边形顶点)
# 这些点应该是你想要矫正的区域的四个角
points1 = np.array([
[200, 100], # 左上点
[700, 150], # 右上点
[140, 400], # 左下点
[650, 460] # 右下点
], dtype=np.float32)
# 3. 定义目标位置(矩形的四个角)
# 这里我们让四边形变成一个矩形
points2 = np.array([
[0, 0], # 目标左上点
[img_shape[1], 0], # 目标右上点(图像宽度)
[0, img_shape[0]], # 目标左下点(图像高度)
[img_shape[1], img_shape[0]] # 目标右下点
], dtype=np.float32)
# 4. 在原图上绘制四边形,方便查看选取的区域
# 绘制四条边
cv2.line(image_np,
tuple(points1[0].astype(int)),
tuple(points1[1].astype(int)),
(0, 0, 255), 2) # 红色线
cv2.line(image_np,
tuple(points1[1].astype(int)),
tuple(points1[3].astype(int)),
(0, 0, 255), 2)
cv2.line(image_np,
tuple(points1[3].astype(int)),
tuple(points1[2].astype(int)),
(0, 0, 255), 2)
cv2.line(image_np,
tuple(points1[2].astype(int)),
tuple(points1[0].astype(int)),
(0, 0, 255), 2)
# 5. 计算透视变换矩阵
M = cv2.getPerspectiveTransform(points1, points2)
print("透视变换矩阵M:")
print(M)
# 6. 应用透视变换
image_warpPerspective = cv2.warpPerspective(image_np, M,
(img_shape[1], img_shape[0]))
# 7. 显示图像
cv2.imshow('原始图像(带标记)', image_np)
cv2.imshow('透视变换结果', image_warpPerspective)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 代码详细解释
步骤1:读取图像
python
image_np = cv2.imread('./test.png')
img_shape = image_np.shape
img_shape返回一个元组:(高度, 宽度, 通道数)。注意OpenCV中高度在前,宽度在后。
步骤2:定义原始点
python
points1 = np.array([[200, 100], [700, 150], [140, 400], [650, 460]], dtype=np.float32)
这4个点定义了一个四边形区域,我们将对这个区域进行透视变换。点的顺序应该是:左上、右上、左下、右下。
步骤3:定义目标点
python
points2 = np.array([[0, 0], [img_shape[1], 0],
[0, img_shape[0]], [img_shape[1], img_shape[0]]])
这4个点定义了一个矩形,对应图像的四角。points1中的四个点将被映射到points2中的对应位置。
步骤4:绘制原始区域
在原始图像上绘制四边形,方便查看我们选择的是哪个区域。
步骤5:计算变换矩阵
python
M = cv2.getPerspectiveTransform(points1, points2)
这个函数根据4对对应点计算透视变换矩阵。需要至少4个点是因为有8个参数需要确定。
步骤6:应用变换
python
image_warpPerspective = cv2.warpPerspective(image_np, M, (img_shape[1], img_shape[0]))
将计算出的变换矩阵应用到整个图像上,输出图像尺寸与原始图像相同。
四、核心函数详解
4.1 cv2.getPerspectiveTransform()
功能:计算两个平面之间的透视变换矩阵。
参数:
src:源图像中四边形顶点的坐标,4×2数组dst:目标图像中对应的四边形顶点坐标,4×2数组
返回值:3×3的透视变换矩阵。
重要说明:
- 需要至少4个点
- 点的顺序必须对应
- 点不能共线(不能在一条直线上)
4.2 cv2.warpPerspective()
功能:对图像应用透视变换。
参数:
src:输入图像M:3×3透视变换矩阵dsize:输出图像大小,(宽度, 高度)flags:插值方法(可选,默认为INTER_LINEAR)borderMode:边界填充模式(可选)borderValue:边界填充值(可选)
常用插值方法:
cv2.INTER_NEAREST:最近邻插值,速度快cv2.INTER_LINEAR:双线性插值,效果较好(默认)cv2.INTER_CUBIC:双三次插值,质量更高
五、总结
本文介绍了OpenCV中透视变换的基础知识:
8.1 核心要点
- 透视变换是什么:一种改变图像视角的变换方法
- 核心函数 :
cv2.getPerspectiveTransform():计算变换矩阵cv2.warpPerspective():应用变换
- 关键参数:需要4对对应点来确定变换关系
- 点的顺序:必须保持一致(建议:左上、右上、左下、右下)
8.2 学习建议
- 从简单开始:先使用明显的四边形区域进行练习
- 观察变化:调整点坐标,观察变换效果的变化
- 理解对应关系:源点如何映射到目标点
- 动手实践:自己选择不同的点和图像进行尝试
透视变换是OpenCV中比较实用且有趣的功能,通过掌握这一基础,你可以在很多实际应用中发挥作用,比如文档校正、图像拼接等。
如果觉得本文有帮助,欢迎点赞、收藏、关注!
你的支持是我持续创作的最大动力!