图像变换:掌握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.pswp.cn/pingmian/95124.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95124.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95124.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis Windows 7.0.5 安装教程(附exe/msi下载+环境配置+命令测试)

​第一步:下安装包​ 打开浏览器(比如 Edge 或 Chrome),复制这个链接到地址栏敲回车: https://pan.quark.cn/s/31912e0d0443 进去后往下翻,找名字带 ​**redis-7.0.5​ 的文件,​选那个 .exe 结…

数据结构(单链表)

目录 1.链表的概念及结构 2.单链表的应用 2.1 打印链表 2.2申请新节点 2.3插入(尾删和头删) 2.4删除(尾删和头删) 2.5查找 2.6任意位置插入 2.7删除指定位置的元素 2.8 销毁链表 3.总结 1.链表的概念及结构 &#xff…

电脑没加域却能获取到IP地址

企业网络管理的核心逻辑!电脑没加域却能获取到IP地址,这完全是一种刻意为之的安全设计,而不是网络故障。 简单来说就是:“给你IP,但不给你权限。” 这背后是一套完整的 网络准入控制(NAC) 策略。…

Go语言入门学习笔记

📚 前言 欢迎学习Go语言!这份教材假设您是编程零基础,从最基本的概念开始讲解。Go语言(也称为Golang)由Google开发,简单、高效、并发能力强,适合后端开发、系统编程和云计算。 学习建议&#xf…

gradle安装、配置环境变量、配置阿里源及idea 中配置gradle

下载gradle https://services.gradle.org/distributions/ 配置系统环境变量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 设置 path,新增一行 %GRADLE_…

C# FlaUI win 自动化框架,介绍

一、简洁介绍 FlaUI 是一套基于 .NET 的 Windows 桌面应用自动化测试库,支持 Win32、WinForms、WPF、UWP 等多种类型的应用。它基于微软原生 UI Automation 库,提供了更现代、易用的 API,适合自动化测试工程师和开发者实现高效、可维护的 UI …

命名空间级别应用 Pod 安全标准

🎯 命名空间级别应用 Pod 安全标准 一、创建 Kubernetes 集群(使用 kind) 使用 kind (Kubernetes IN Docker)快速创建一个本地集群: kind create cluster --name my-cluster验证集群是否运行正常&#xff1…

Ubuntu 25.10 Snapshot4 发布。

Ubuntu 25.10 的第四个快照(Snapshot 4)已于 2025 年 8 月 28 日发布,供开发者和测试人员进行验证。这是 Ubuntu 25.10 正式发布前的最后一个月度快照,标志着该版本已进入功能冻结阶段,预计将在 10 月发布正式版。 Ca…

STM32F2/F4系列单片机解密和芯片应用介绍

STM32F2/F4系列单片机解密和芯片应用介绍STM32F2和STM32F4系列微控制器凭借其出色的性能、丰富的外设接口和强大的连接能力,在很多对计算能力和实时性有要求的领域都有应用。同时,芯片解密的价格因其型号、加密技术等因素差异较大。🧭 重要提…

250901-BookStack跨服务器从Rootless-Docker到Rootful-Docker的备份迁移及服务启动

下面给你一套「可离线、最小停机」的迁移步骤,从 A(rootless)搬到 B(rootful)。思路是:停 A → 打包数据卷 → 传到 B → 还原 → 用同版本镜像启动 → 验证。整套操作不依赖公网,只用你已有的离…

(Redis)Redis 分布式锁及改进策略详解

一、为什么需要分布式锁在单机应用中,synchronized 或 ReentrantLock 足以解决并发问题。但在 分布式系统 中,多台服务器之间共享同一个资源时,如果没有锁,很可能出现 超卖、重复扣减、数据不一致 等问题。 因此,分布式…

Linux应用开发-windows,linux环境下相关工具

VS Code Remote - SSH 虚拟机部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 设置开机自启hostname -IVS Code部分的操作 安装 Remote - SSH 插件 vscode右下角出现&#xff…

Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点

上次跟你们聊了泛型的基础用法,今天接着往下说 —— 泛型里还有个挺重要的概念叫 “通配符”,就是那个问号 “?”,很多人第一次见都懵:这玩意儿跟普通泛型有啥区别?为啥有时候非得用它不可?小索奇当初也卡…

EXCEL开发之路(二)跨表交互模拟—仙盟创梦IDE

在车辆租赁行业,数据的高效管理与分析对于企业的运营决策、资源调配及客户服务优化至关重要。自建 Excel 实现多表统计交互,如同为行业装上了效能驱动引擎,助力企业在复杂多变的市场环境中稳健前行。一、精准资源管理,优化车辆调配…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)

5.4 性能测试与结果分析 为了评估GoEHRStream的性能,我们设计测试模拟真实的医院数据流场景,并测量关键指标。 5.4.1 实验环境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

开关电源设计“反馈回路”部分器件分析

目录 主要分析问题如下: 一、问题1 二、问题二 分析电路如下: 主要分析问题如下: 1、分析TL431芯片1、2两引脚间并联电阻和电容(RC电路)的作用? 2、PC817A光耦输入两个引脚间并联电阻的作用?…

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱 在数字经济快速发展的当下,AI 技术正不断渗透到各个领域,其中 **#AI 编程凭借高效、便捷的优势,成为不少开发者和创业者的新选择。尤其是在小游戏…

Kafka 架构原理

一个kafka集群中包含一个或多个Producer、一个或多个broker、一个或多个ConsumerGrop以及一个Zookeeper集群。kafka通过Zookeeper管理kafka集群配置、leader副本的选举、生产者的负载均衡等。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消…

用 PyTorch 搭建 CNN 实现 MNIST 手写数字识别

在图像识别领域,卷积神经网络(CNN) 凭借其对空间特征的高效提取能力,成为手写数字识别、人脸识别等任务的首选模型。而 MNIST(手写数字数据集)作为入门级数据集,几乎是每个深度学习学习者的 “第…

CTFshow系列——命令执行web61-68

本篇文章介绍了不同了方法进行题目的解析以及原因讲解。 文章目录Web61尝试了一下,被过滤的payload如下:所以,根据上述思路,这里尝试过的payload为:Web62(同Web61)Web63(同Web62&…