计算机视觉处理(OpenCV基础教学(十二):图像透视变换基础)

OpenCV基础教学(十二):图像透视变换基础

透视变换是图像处理中的一项重要技术,能够校正图像的视角,本文将详细介绍其基本原理和OpenCV实现方法。

总流程图:

一、透视变换的基本概念

1.1 什么是透视变换?

透视变换(Perspective Transformation)是一种二维平面到二维平面的投影变换,也称为单应性变换(Homography Transformation)。它能够改变图像的观察视角,矫正因拍摄角度造成的透视畸变。

简单理解:就像你从侧面看一张卡片,卡片会显得倾斜变形,透视变换就是把这个倾斜的视图"扶正",变成正面视角。

1.2 透视变换的应用

  1. 文档扫描:将倾斜拍摄的文档变成正面视图
  2. 车牌识别:校正倾斜的车牌图像
  3. 图像拼接:将不同视角的图像对齐
  4. 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的透视变换矩阵。

重要说明

  1. 需要至少4个点
  2. 点的顺序必须对应
  3. 点不能共线(不能在一条直线上)

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 核心要点

  1. 透视变换是什么:一种改变图像视角的变换方法
  2. 核心函数
    • cv2.getPerspectiveTransform():计算变换矩阵
    • cv2.warpPerspective():应用变换
  3. 关键参数:需要4对对应点来确定变换关系
  4. 点的顺序:必须保持一致(建议:左上、右上、左下、右下)

8.2 学习建议

  1. 从简单开始:先使用明显的四边形区域进行练习
  2. 观察变化:调整点坐标,观察变换效果的变化
  3. 理解对应关系:源点如何映射到目标点
  4. 动手实践:自己选择不同的点和图像进行尝试

透视变换是OpenCV中比较实用且有趣的功能,通过掌握这一基础,你可以在很多实际应用中发挥作用,比如文档校正、图像拼接等。


如果觉得本文有帮助,欢迎点赞、收藏、关注!
你的支持是我持续创作的最大动力!

相关推荐
创客匠人老蒋11 小时前
从“经验驱动”到“系统智能”:实体门店经营的结构性升级
大数据·人工智能
安达发公司11 小时前
安达发|APS自动排产排程排单软件:让汽车零部件厂排产不“卡壳”
大数据·人工智能·汽车·aps高级排程·aps排程软件·aps自动排产排程排单软件
草莓熊Lotso11 小时前
脉脉独家【AI创作者xAMA】| 多维价值与深远影响
运维·服务器·数据库·人工智能·脉脉
V搜xhliang024611 小时前
常规超声联合影像组学预测肾透明细胞癌核分级的列线图模型构建和验证
人工智能·计算机视觉
柠檬071112 小时前
opencv 未知函数记录-detailEnhance
人工智能·opencv·计算机视觉
空山新雨后、12 小时前
ComfyUI、Stable Diffusion 与 ControlNet解读
人工智能
Hcoco_me12 小时前
大模型面试题42:从小白视角递进讲解大模型训练的重计算
人工智能·rnn·深度学习·lstm·transformer
喜欢吃豆12 小时前
代理式 CI/CD 的崛起:Claude Code Action 深度技术分析报告
人工智能·ci/cd·架构·大模型
2301_7644413312 小时前
基于HVNS算法和分类装载策略的仓储系统仿真平台
人工智能·算法·分类
aitoolhub12 小时前
在线设计技术实践:稿定设计核心架构与能力拆解
图像处理·人工智能·计算机视觉·自然语言处理·架构·视觉传达