图像几何变换(仿射变换和透视变换...)及python-opencv实现

本文主要是介绍图像几何变换(仿射变换和透视变换...)及python-opencv实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 图像变换类型
    • 仿射变换
    • 透视变换
    • python-opencv实现
    • 参考文献

图像变换类型

图像几何变换主要包括以下几种类型:

  1. 平移(Translation):将图像在水平或垂直方向上移动,不改变图像的尺寸和形状。
  2. 缩放(Scaling):改变图像的大小,可以是均匀缩放,即保持图像的长宽比,或者是非均匀缩放,即在水平和垂直方向上使用不同的缩放因子。
  3. 旋转(Rotation):将图像绕某一点(通常是图像中心)旋转一定角度,旋转后的图像位置会发生变化。
  4. 镜像(Mirroring):也称为翻转,可以是水平镜像或垂直镜像,即将图像沿水平轴或垂直轴翻转。
  5. 仿射变换(AffineTransformation):包括平移、缩放、旋转和错切等线性变换,保持直线和平行线的性质不变。
  6. 透视变换(PerspectiveTransformation):也称为投影变换,它涉及到三维空间中的点到二维平面的映射,可以模拟三维空间中物体的透视效果。

其中,又可以将其分为两大类:仿射变换透视变换。透视变换的作用域是一个三维坐标系(x,y,z), 而仿射变换则是二维(x,y)平面变换。从另一个角度来说,仿射变换也可以看做是一种特殊的透视变换(z轴方向不变)。
透视变换和仿射变换的一个重要区别是:两条平行的线在经过仿射变换之后依然保持平行,但透视变换并不保证这一点。

仿射变换

为了统一将所有的仿射变换都用一种方式表达出来,引入了齐次坐标,这样就能够将平移变换和线性变换表示在一个矩阵中了。如下所示:
在这里插入图片描述
对于单个仿射变换,其矩阵表示如下:
在这里插入图片描述

透视变换

透视变换(Perspective Transformation)是将二维的图片投影到一个三维视平面上,然后再转换到二维坐标下,所以也称为投影映射(Projective Mapping)。简单来说就是二维→三维→二维的一个过程。
在这里插入图片描述

透视变换的矩阵表示如下,我们可以看到它与仿射变换的区别便是最后一行的参数c1和c2的值,对于仿射变换c1=c2=0。
在这里插入图片描述
在这里插入图片描述
通过透视变换的变换矩阵计算新的坐标,其中a33=1,x’和y’为最终计算的结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,已经知道了仿射变换和透视变换的变换矩阵,那在实际应用时该如何求呢?一个方法是直接根据几何参数计算变换矩阵,另外一个方法是通过原始图像坐标和目标图像坐标求解变换矩阵。通常情况下,更多选择是后者的计算方法。

对于仿射变换,只有6个参数,因此只需要3个点对就可以求解了;而透视变换,则需要8个参数,需要4个点对才能够求解。如下所示为透视变换矩阵的8个方程组。
在这里插入图片描述

python-opencv实现

图像几何变换在计算机视觉和图像处理中有着广泛的应用,如图像配准、目标识别、图像校正等。在实际应用中,这些变换通常通过变换矩阵来实现,可以通过OpenCV等图像处理库来进行操作。
在这里插入图片描述
这是用chatgpt写的代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('../images/girl1.jpg')# 平移变换
rows, cols = image.shape[:2]
M_translation = np.float32([[1, 0, 50], [0, 1, 100]])  # 水平移动50像素,垂直移动100像素
translated_image = cv2.warpAffine(image, M_translation, (cols, rows))# 缩放变换
scale_factor = 0.5  # 缩小为原来的一半
resized_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor)# 旋转变换
center = (cols // 2, rows // 2)
angle = 45  # 旋转角度为45度
M_rotation = cv2.getRotationMatrix2D(center, angle, 1)
rotated_image = cv2.warpAffine(image, M_rotation, (cols, rows))# 镜像变换(水平镜像)
flipped_image = cv2.flip(image, 1)  # 参数1表示水平镜像,参数0表示垂直镜像# 仿射变换
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
M_affine = cv2.getAffineTransform(pts1, pts2)
affined_image = cv2.warpAffine(image, M_affine, (cols, rows))# 透视变换
pts3 = np.float32([[0, 65], [368, 52], [28, 387], [389, 390]])
pts4 = np.float32([[0, 0], [200, 0], [60, 300], [500, 300]])
M_perspective = cv2.getPerspectiveTransform(pts3, pts4)
perspective_image = cv2.warpPerspective(image, M_perspective, (cols, rows))# 错切变换
M_shearing = np.float32([[1, 0.2, 0], [0.2, 1, 0]])
sheared_image = cv2.warpAffine(image, M_shearing, (cols, rows))# 转置变换
transposed_image = cv2.transpose(image)# 显示结果图像
plt.figure()
plt.subplot(331)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')plt.subplot(332)
plt.imshow(cv2.cvtColor(translated_image, cv2.COLOR_BGR2RGB))
plt.title('Translated Image')plt.subplot(333)
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.title('Resized Image')plt.subplot(334)
plt.imshow(cv2.cvtColor(rotated_image, cv2.COLOR_BGR2RGB))
plt.title('Rotated Image')plt.subplot(335)
plt.imshow(cv2.cvtColor(flipped_image, cv2.COLOR_BGR2RGB))
plt.title('Flipped Image')plt.subplot(336)
plt.imshow(cv2.cvtColor(affined_image, cv2.COLOR_BGR2RGB))
plt.title('Affine Image')plt.subplot(337)
plt.imshow(cv2.cvtColor(perspective_image, cv2.COLOR_BGR2RGB))
plt.title('Perspective Image')plt.subplot(338)
plt.imshow(cv2.cvtColor(sheared_image, cv2.COLOR_BGR2RGB))
plt.title('Sheared Image')plt.subplot(339)
plt.imshow(cv2.cvtColor(transposed_image, cv2.COLOR_BGR2RGB))
plt.title('Transposed Image')plt.show()

参考文献

[1] 仿射变换(Affine Transformation)在2D和3D坐标下的变换矩阵
[2] (十四)透视变换
[3] 算法笔记 : 透视变换(透射变换)
[4] 仿射变换和透视变换矩阵的参数含义与区别

这篇关于图像几何变换(仿射变换和透视变换...)及python-opencv实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836681

相关文章

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q