当前位置: 首页 > 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.xdnf.cn/news/1420723.html

相关文章:

  • 深入解析 Go 程序逆向风险与防护策略
  • 如何对嵌入式软件进行单元测试
  • 无重复字符的最长子串,leetCode热题100,C++实现
  • Vue3响应式陷阱:如何避免ref解构导致的响应式丢失
  • 电动自行车车架前叉振动、组合件冲击、把立管弯曲强度试验机等机械强度性能测试项目解析
  • 【趣味阅读】Python 文件头的秘密:从编码声明到 Shebang
  • Spring事务管理策略对比与性能优化实践指南
  • AI辅助论文写作,在《人工智能生成合成内容标识办法》出台后的新规则
  • HarmonyOS 应用开发深度实践:深入 Stage 模型与 ArkTS 声明式 UI
  • Linux - JDK安装
  • 刷题之链表oj题目
  • 突破超强回归模型,高斯过程回归!
  • 大语言模型对齐
  • VMware pro16(许可证)+centos 7超详细安装教程
  • MQ使用场景分析
  • 【RK3576】【Android14】PMIC电源管理
  • DVWA靶场通关笔记-SQL Injection Blind(SQL盲注 Impossible级别)
  • kubectl-etcd
  • 【C++】内存管理机制:从new到delete全解析
  • 植物中lncRNA鉴定和注释流程,代码(包含Identified,Classification,WGCNA.....)
  • 开发中使用——鸿蒙CoreSpeechKit语音识别
  • 基于MCP架构的OpenWeather API服务端设计与实现
  • C#在物联网GPS经纬度转换为百度地图地址
  • 亚马逊云代理商:如何选择适合的AWS EC2实例类型?
  • CVE Push Service | 高危漏洞实时情报自动化推送工具
  • Vue基础知识-使用监视属性watch和计算属性computed实现列表过滤+排序
  • 【golang长途旅行第35站】Redis
  • docker中的命令(六)
  • 针对redis中的热数据该怎么处理
  • ✝常用表格✝