当前位置: 首页 > news >正文

机器视觉学习-day09-图像矫正

1 仿射变换与透视变换

1.1 仿射变换

之前在图像旋转实验中已经接触过仿射变换,仿射变换是一个二维坐标系到另一个二维坐标系的过程,在仿射变换中符合直线的平直性和平行性。

    1.2 透视变换

    透视变换是把一个图像投影到一个新的视平面的过程。在现实世界中,观察到的物体在人类视觉中都会受到透视效果的影响:近大远小。

    1.3 透视变换矩阵

    与仿射变换相同,透视变换也有对应的透视变换矩阵,在这个过程原始图像src中的点(x,y)通过透视变换被转换到到dst图像中的新坐标点(x',y')

    代码运行步骤:

    图片输入→坐标选取→获取透视变换矩阵→透视变换→插值方法→边缘填充→图片输出

    原始图片:4.jpg

    import cv2  # 导入OpenCV库,用于计算机视觉任务
    import numpy as np  # 导入NumPy库,用于数值计算和数组操作
    import matplotlib.pyplot as pltif __name__ == '__main__':# 1. 图片输入path = '4.jpg'  # 定义图片路径image_np = cv2.imread(path)  # 读取图片,返回NumPy数组格式的图像数据# 2. 坐标选取# 左上、右上、左下、右下points = [[171, 5], [271, 105], [27, 150], [127, 248]]# 转换为np数组pts1 = np.float32(points)  # src的四个角点:将点列表转换为NumPy数组,数据类型为32位浮点数print(pts1)  # 打印点坐标print(type(pts1))  # 打印数据类型# 画红框,标记ROI区域image_line = image_np.copy()  # 创建原图的副本,避免修改原图# 画四条线,标记出要校正的区域cv2.line(image_line,  # 在哪个图像上画线points[0],  # 起点points[1],  # 终点(0, 0, 255),  # 颜色(B,G,R格式),这里是红色2,  # 线条粗细cv2.LINE_AA  # 抗锯齿线型,使线条更平滑)# 重复画线操作,连接其他点形成四边形cv2.line(image_line, points[1], points[3], (0, 0, 255), 2, cv2.LINE_AA)cv2.line(image_line, points[2], points[3], (0, 0, 255), 2, cv2.LINE_AA)cv2.line(image_line, points[0], points[2], (0, 0, 255), 2, cv2.LINE_AA)# 3. 获取透视变换矩阵# 获得原图分辨率,这个原图分辨率是后面定义矫正后的图片分辨率大小。# img_shape = image_np.shape  # 获取图像形状(高度, 宽度, 通道数)# print("原图分辨率:", img_shape)img_shape = (260, 170, 3)  # 可自行定义图像形状(高度, 宽度, 通道数)# 定义目标点:左上、右上、左下、右下 - 对应整个图像的四个角points = [[0, 0], [img_shape[1], 0], [0, img_shape[0]], [img_shape[1], img_shape[0]]]print(points)  # 打印目标点坐标# 转换为np数组pts2 = np.float32(points)  # dst的四个角点:将目标点转换为NumPy数组# 生成透视变换矩阵M = cv2.getPerspectiveTransform(pts1,  # src的四个角点: 源图像的四个角点(要校正的区域)pts2   # dst的四个角点: 源图像的四个角点(要校正的区域))print(M)  # 打印透视变换矩阵# 4. 透视变换 + 5. 插值方法 + 6. 边缘填充correct_image = cv2.warpPerspective(image_np,  # 原图M,  # 透视变换矩阵(img_shape[1], img_shape[0]),  # dst分辨率:输出图像尺寸(宽度, 高度)cv2.INTER_LINEAR,  # 插值方法:双线性插值,平衡速度和质量cv2.BORDER_WRAP  # 边缘填充:边缘像素环绕)# 使用matplotlib手动去看要截取的x,y的数组参数q = plt.imread(path)plt.imshow(q)plt.axis('off')  # 取消坐标轴显示plt.show()# 7. 图片输出cv2.imshow('image_line', image_line)  # 显示带有标记线的图像cv2.imshow('correct_image', correct_image)  # 显示校正后的图像cv2.waitKey(0)  # 等待键盘输入,0表示无限等待cv2.imwrite('jz.png', correct_image)
    

    运行结果:

    http://www.dtcms.com/a/355402.html

    相关文章:

  • 客户预充值系统(一) - 数据库设计与数据插入
  • JVM——八股文
  • curl、python-requests、postman和jmeter的对应关系
  • DJI无人机云哨DroneID技术解析:天空中的数字身份证
  • 2025年KBS SCI1区TOP,矩阵差分进化算法+移动网络视觉覆盖无人机轨迹优化,深度解析+性能实测
  • Maven核心用法
  • ubuntu挂载外接硬盘
  • IDEA 中创建 Springboot 项目没有 Java8 选项的解决办法
  • 介绍智慧城管十大核心功能之一:风险预警系统
  • 关于npm安装electron和better-sqlite3失败问题
  • Copilot、Cursor、Trae、ChatGPT 的“四件套”场景选择表
  • 第六届智能计算与人机交互国际研讨会(ICHCI 2025)
  • MySQL 与 ClickHouse 深度对比:架构、性能与场景选择指南
  • 【数字IC后端】引导时钟树CTS的生成方向之anchor driver
  • 详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?
  • Pyomo、PuLP 和 OR-Tools 解决约束优化问题效率对比
  • C# SIMD编程实践:工业数据处理性能优化案例
  • 基于SpringBoot的校园资料分享系统【2026最新】
  • 数据结构-哈夫曼树和B树
  • 安宝特方案丨安宝特工业AR全链路解决方案
  • Centos 8 磁盘扩展xfs文件系统 (LVM)
  • 利用 Java 爬虫获取 AQI 详情数据(代码示例)实战指南
  • 如何使用Windows自带的PnPUtil命令来禁用/停用和启用硬件设备
  • VPC私有域名解析DNS
  • 使用 Action 自动部署 VuePress 到 GitHub Pages
  • GRE隧道IPv6过渡技术
  • 数制与编码
  • 并发编程——04 深入理解CASAtomic原子操作类详解
  • Qt 中日志级别
  • JS中的String总结