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

Python OpenCV图像处理与深度学习:Python OpenCV图像几何变换入门

图像变换:掌握OpenCV中的几何变换

学习目标

通过本课程,学员们将能够理解图像的几何变换原理,包括缩放、旋转和平移,并能够使用Python和OpenCV库实现这些变换。本课程将通过理论讲解与实践操作相结合的方式,帮助学员们掌握图像处理的基础技能。

相关知识点

  • Python OpenCV图像变换

学习内容

1 Python OpenCV图像变换

1.1 图像缩放

图像缩放是图像处理中最基本的操作之一,它涉及到改变图像的大小。在OpenCV中,可以使用cv2.resize()函数来实现图像的缩放。缩放图像时,可以指定新的图像尺寸,也可以指定缩放比例。缩放比例可以是放大也可以是缩小,这取决于比例系数的大小。

1.1.1 理论知识

图像缩放的基本原理是通过插值算法来估计新图像中每个像素的值。插值算法的选择会影响缩放后的图像质量。常见的插值算法包括最近邻插值、双线性插值和双三次插值。最近邻插值算法简单快速,但可能会导致图像质量下降;双线性插值和双三次插值算法虽然计算复杂度较高,但能够提供更好的图像质量。

在OpenCV中,cv2.resize()函数的参数包括源图像、目标图像的尺寸以及插值方法。插值方法可以通过指定interpolation参数来选择,例如cv2.INTER_NEAREST(最近邻插值)、cv2.INTER_LINEAR(双线性插值)、cv2.INTER_CUBIC(双三次插值)等。

1.1.2 实践操作

执行以下指令获取测试图片。

wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/27ef5b722fa911f09b27fa163edcddae/example.jpg

下面是一个使用OpenCV进行图像缩放的示例代码:

import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread('example.jpg')# 定义缩放比例
scale_percent = 50  # 缩小到50%
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)# 缩放图像
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
# 显示原始图像和缩放后的图像
# 将 BGR 格式转换为 RGB 格式,以适配 matplotlib 的显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
resized = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
# 创建画布和子图(1行2列)
# 显示第一张图像
plt.subplot(1, 2, 1)  # 1行2列,第1个位置
plt.imshow(image)
plt.title('Original Image')
# 显示第二张图像
plt.subplot(1, 2, 2)  # 1行2列,第2个位置
plt.imshow(resized)
plt.title('Resized Image')
plt.tight_layout()  # 自动调整布局
plt.show()

在这里插入图片描述

1.2 图像旋转

图像旋转是指将图像绕着某个点(通常是图像的中心点)旋转一定的角度。在OpenCV中,可以使用cv2.getRotationMatrix2D()函数来获取旋转矩阵,然后使用cv2.warpAffine()函数来应用旋转矩阵,实现图像的旋转。

1.2.1 理论知识

图像旋转的基本原理是通过旋转矩阵来变换图像中的每个像素。旋转矩阵是一个2x3的矩阵,其中前两列表示旋转和平移,第三列表示平移。旋转矩阵的计算公式为:

R=[cos⁡(θ)−sin⁡(θ)0sin⁡(θ)cos⁡(θ)0001]R = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix}R=cos(θ)sin(θ)0sin(θ)cos(θ)0001

其中,θ\thetaθ 是旋转角度。为了确保旋转后的图像不会被裁剪,通常需要计算旋转后的图像尺寸,并在旋转矩阵中加入平移部分。

1.2.2 实践操作

下面是一个使用OpenCV进行图像旋转的示例代码:

import cv2
import numpy as np# 读取图像
image = cv2.imread('example.jpg')# 获取图像的中心点
(h, w) = image.shape[:2]
center = (w // 2, h // 2)# 定义旋转角度和缩放比例
angle = 45  # 旋转45度
scale = 1.0  # 保持原大小# 获取旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)# 应用旋转矩阵
rotated = cv2.warpAffine(image, M, (w, h))
# 显示原始图像和旋转后的图像
# 将 BGR 格式转换为 RGB 格式,以适配 matplotlib 的显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rotated = cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB)
# 创建画布和子图(1行2列)
# 显示第一张图像
plt.subplot(1, 2, 1)  # 1行2列,第1个位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 显示第二张图像
plt.subplot(1, 2, 2)  # 1行2列,第2个位置
plt.imshow(rotated)
plt.title('Rotated Image')
plt.axis('off')
plt.tight_layout()  # 自动调整布局
plt.show()
1.3 图像平移

图像平移是指将图像中的所有像素沿水平和垂直方向移动一定的距离。在OpenCV中,可以使用cv2.warpAffine()函数来实现图像的平移。平移矩阵是一个2x3的矩阵,其中前两列表示平移距离,第三列表示平移。

1.3.1 理论知识

图像平移的基本原理是通过平移矩阵来变换图像中的每个像素。平移矩阵的计算公式为:

T=[10tx01ty001] T = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} T=100010txty1

其中,txt_xtxtyt_yty 分别是水平和垂直方向的平移距离。平移矩阵可以直接用于cv2.warpAffine()函数,实现图像的平移。

1.3.2 实践操作

下面是一个使用OpenCV进行图像平移的示例代码:

import cv2
import numpy as np# 读取图像
image = cv2.imread('example.jpg')# 定义平移距离
tx = 100  # 水平方向平移100像素
ty = 50   # 垂直方向平移50像素# 构建平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])# 应用平移矩阵
translated = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 显示原始图像和平移后的图像
# 将 BGR 格式转换为 RGB 格式,以适配 matplotlib 的显示
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
translated = cv2.cvtColor(translated, cv2.COLOR_BGR2RGB)
# 创建画布和子图(1行2列)
# 显示第一张图像
plt.subplot(1, 2, 1)  # 1行2列,第1个位置
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
# 显示第二张图像
plt.subplot(1, 2, 2)  # 1行2列,第2个位置
plt.imshow(translated)
plt.title('Translated Image')
plt.axis('off')
plt.tight_layout()  # 自动调整布局
plt.show()

在这里插入图片描述

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

相关文章:

  • 线程池发生了异常该怎么处理?
  • Groovy 的核心语法
  • 计算机视觉与深度学习 | 传统图像处理技术的未来发展前景分析
  • 算法练习——169.多数元素
  • 焦耳热技术助力顶刊研究:薄层质子交换膜实现高效水电解制氢
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第八章知识点问答(18题)
  • 在工业质检中,机器视觉与人工检测的决策依据
  • Java类加载机制
  • 亚马逊云代理商:如何选择适合的AWS EC2实例类型?
  • ARM-SPI屏幕案例
  • 1. 叙述与命题
  • 【开题答辩全过程】以 基于JSP的养生网站设计与实现为例,包含答辩的问题和答案
  • 在JAVA中Mybatis的使用
  • GitHub每日最火火火项目(9.1)
  • TDengine 日期时间函数 DAYOFWEEK 使用手册
  • shell编程基础入门-3
  • 人工势场法(APF)路径规划 MATLAB
  • 战略进阶——解读92页培训_战略+概述与基本框架麦肯锡【附全文阅读】
  • 一个好的智能体框架应该是什么样子
  • Transformer的并行计算与长序列处理瓶颈总结
  • Solid Explorer文件管理器:功能强大的安卓文件管理器及网盘文件管理器
  • 2025年职场人士专业证书选择与分析
  • 从 “对话” 到 “共创”:生成式 AI 如何重塑内容创作全流程,普通人也能掌握的高效工具指南
  • Windows 安装配置解压版MongoDb
  • ‌ C++ 继承与派生类
  • 从DevOps到BizDevOps:哪些DevOps工具能够成为业务创新加速引擎?
  • Java网络编程基础 Socket通信入门指南
  • 『C++成长记』vector模拟实现
  • Veo Videos Generation API 对接说明
  • 【LLM】使用 LoRA 对 Qwen/Qwen3-Embedding-0.6B 进行微调