计算机视觉处理(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中比较实用且有趣的功能,通过掌握这一基础,你可以在很多实际应用中发挥作用,比如文档校正、图像拼接等。


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

相关推荐
奔跑中的小象10 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南10 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang10 小时前
LangGraph 状态机实战
人工智能
刹那芳华199210 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作10 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门10 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜10 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟11 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦11 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能
阿里云云原生11 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能