写一段图片平移的脚本

news2025/7/19 12:15:24

问题描述:

写一段图片平移的脚本。

平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离是(t_{x},t_{y}),你可以以下面的方式构建移动矩阵:M=\begin{bmatrix} 1 &0 &t_{x} \\ 0& 1 &t_{y} \end{bmatrix}

你可以使用Numpy 数组构建这个矩阵(数据类型是np.float32),然后把它传给函数cv2.warpAffine()。看看下面这个例子吧,它被移动了(100,50)个像素。

写一个平移的的脚本,要求用到函数cv2.warpAffine()。

问题解答:

下面是一个使用 cv2.warpAffine() 实现图像平移的示例脚本。该脚本将图像平移(100, 50)个像素:

import cv2
import numpy as np

# 加载图像
img = cv2.imread('logo.jpg')

# 获取图像的尺寸
height, width = img.shape[:2]

# 定义平移矩阵
tx, ty = 100, 50  # 平移的距离
M = np.float32([[1, 0, tx],  # x 方向的移动
                 [0, 1, ty]])  # y 方向的移动

# 应用平移
translated_img = cv2.warpAffine(img, M, (width, height))

# 显示原始图像和平移后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Translated Image', translated_img)

# 按下ESC键退出
while True:
    if cv2.waitKey(1) & 0xFF == 27:
        break

cv2.destroyAllWindows()

代码说明:

  1. 加载图像:使用 cv2.imread() 读取图像。
  2. 获取图像尺寸:使用 img.shape[:2] 获取图像的高度和宽度。
  3. 定义平移矩阵:构建平移矩阵 M,其中 (t_{x},t_{y}) 是平移的距离。
  4. 应用平移:使用 cv2.warpAffine() 将平移矩阵应用到图像。
  5. 显示图像:使用 cv2.imshow() 显示原始图像和平移后的图像。

注意:

  • 确保路径中有 logo.jpg 图像文件,或将其替换为您想要平移的图像路径。

函数cv2.warpAffine()是将两个矩阵相乘吗?内部是如何平移的呢?请用公式证明?

cv2.warpAffine() 函数用于对图像进行仿射变换,包括平移、旋转、缩放等。对于平移操作,它会利用一个 2x3 的平移矩阵来改变图像中每个点的位置。

平移矩阵

平移矩阵的形式为:

M=\begin{bmatrix} 1 &0 &t_{x} \\ 0& 1 &t_{y} \end{bmatrix}

其中,t_{x}t_{y} 分别表示在 x 和 y 方向上的平移距离。

点的变换

对于图像中的每个点 P(x,y),在应用平移矩阵之后,新点 P′(x′,y′)的坐标可以通过以下公式计算:

\begin{bmatrix} {x}'\\ {y}'\\ 1\end{bmatrix}=\begin{bmatrix} 1 & 0 & t_{x}\\ 0& 1 & t_{y} \end{bmatrix}\begin{bmatrix} x\\ y\\ 1\end{bmatrix}

公式证明

具体的计算过程为:

\begin{bmatrix} {x}'\\ {y}'\\ 1\end{bmatrix}=\begin{bmatrix} 1\cdot x+0\cdot y+t_{x}\\ 0\cdot x+1\cdot y+t_{y}\\ 1\end{bmatrix}=\begin{bmatrix} x+t_{x}\\ y+t_{y}\\ 1\end{bmatrix}

由此可得,经过平移变换后,新坐标 P′为:

\left\{\begin{matrix} {x}'=x+t_{x}\\ {y}'=y+t_{y}\end{matrix}\right.

内部实现

cv2.warpAffine() 内部,算法遍历输入图像中的每个像素点,并根据上述公式计算每个点的新位置。这个过程通常涉及以下步骤:

  1. 计算目标像素位置:对于每个源图像的像素位置,根据平移矩阵计算其在目标图像中的新位置。
  2. 插值:由于新位置可能不是整数坐标,OpenCV 使用插值方法(如线性插值)来确定目标像素的颜色值。
  3. 填充:将插值后的颜色值赋给目标图像的新位置。

通过上述步骤,cv2.warpAffine() 可以实现对图像的平移效果。

#############################################################

平移会破坏图像的完整性,那么为什么还会有平移这个操作呢?平移操作的应用是什么呢?

平移操作在计算机视觉和图像处理中的确可能会导致图像部分信息的丢失,但它在许多应用中仍然非常重要。以下是平移操作的主要应用及其原因:

  1. 图像对齐:在处理多张图像时,可能需要将它们对齐,以便进行拼接或合成。平移可以帮助调整不同图像之间的相对位置。

  2. 特征提取:在物体检测和识别中,通过平移图像,可以生成不同的位置,以便在不同的位置上检测特征。这种方法在训练机器学习模型时非常有用。

  3. 运动分析:在视频处理和运动分析中,平移可以用来分析物体在不同帧中的位置变化。这对于追踪运动物体至关重要。

  4. 图像增强:通过平移图像,可以增加数据集的多样性,尤其是在深度学习中,通过数据增强来提高模型的鲁棒性。

  5. 视觉效果:在某些图像处理和视觉效果中,平移可以用来创建动态效果,如滑动条、过渡动画等。

虽然平移可能会导致图像边缘部分的丢失,但它的应用价值在于能够在不同场景和任务中调整图像位置,从而提高后续处理的效果和精度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】哈希的概念与实现

1.哈希概念 通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,可以不经过任何比较,一次直接从表中得到要搜索的元素。 当向该结构中: 插入元素: 根据待插入元素的关键码,以此函数计算出该元素的…

Yocto和Buildroot功能和区别

一.介绍 Yocto 和 Buildroot 都是用于嵌入式 Linux 系统开发的工具集,它们的目的是帮助开发者轻松构建定制的 Linux 系统镜像,以便在嵌入式设备上运行。 二.对比 1.Yocto Yocto 是一个开源的嵌入式 Linux 构建系统,它允许开发者创建自定义…

详解RabbitMQ工作模式之发布订阅模式

目录 发布订阅模式 概念 概念介绍 特点和优势 应用场景 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 运行代码 发布订阅模式 概念 RabbitMQ的发布订阅模式(Publish/Subscribe)是一种消息传递模式,它允许消…

微信学习之导航功能

先看这个功能的效果: 然后开始学习吧。 一、我们这里用的是vant的Grid控件,首先我们导入: { "usingComponents": {"van-search": "vant/weapp/search/index","my-swiper":"../../components…

城市内涝监测预警系统守护城市安全

一、系统背景 城市内涝是指由于强降水或连续性降水超过城市排水能力,导致城市内产生积水灾害的现象。随着气候变化和城市化进程的加快,城市内涝现象愈发频繁和严重。传统的城市排水系统已难以满足当前的城市排水需求,特别是在暴雨等极端天气条…

用 CodeBuddy 搭建「MiniGoal 小目标打卡器」:一次流畅的 UniApp 开发体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在日常生活中,我们总是希望能够坚持一些小习惯,比如每天锻炼十分钟、读一页书、早睡十分…

Web技术与Nginx网站环境部署

目录 一.web基础 1.域名和DNS (1).域名的概念 (2).hosts文件 (3).DNS (4).域名注册 2.网页与HTML (1).网页简介 (2).HTML &a…

AI移动监测:仓储环境安全的“全天候守护者”

AI移动监测在仓储方面的应用:技术赋能与场景突破 一、背景:仓储环境的“隐形威胁”与AI破局 仓储行业长期面临设备损坏、货物损失、卫生隐患等风险。传统监控依赖人工巡检或固定摄像头,难以实时捕捉动态风险。例如: 动物入侵&a…

2025年5月华为H12-821新增题库带解析

IS-IS核心知识 四台路由器运行IS-IS且已经建立邻接关系,区域号和路由器的等级如图中标记,下列说法中正确的有? R2和R3都会产生ATT置位的Level-1的LSPR1没有R4产生的LSP,因此R1只通过缺省路由和R4通信R2和R3都会产生ATT置位的Leve1-2的LSPR2和…

用 python 编写的一个图片自动分类小程序(三)

图片自动分类识别小程序记录 2025/5/18 0:38修改程序界面,增加一些功能 用 python 编写的一个图片自动识别分类小程序。 操作系统平台:Microsoft Windows 11 编程语言和 IDE:python 3.10 Visual studio code 一:图片自动分…

初识 java

目录 前言 一、jdk,JRE和JVM之间的关系 二、JVM的内存划分 前言 初步了解 jdk,JRE,JVM 之间的关系,JVM 的内存划分。 一、jdk,JRE和JVM之间的关系 jdk 是 java 开发工具集,包含JRE; JRE 是…

frida 配置

1.环境 1.1 下载 frida-server firda-server github下载地址 这边推荐使用最新版的上一个版本 根据虚拟机自行选择版本 我使用这个版本 frida-server-16.7.17-android-x86_64 1.2 启动 frida-server-16.7.17-android-x86_64 将文件解压至虚拟机目录 使用adb命令执行 chmo…

16-看门狗和RTC

一、独立看门狗 1、独立看门狗概述 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞(不按照正常程序进行运行,如程序重启,但是如果我们填加看门狗的技术&#xff0…

【AI论文】用于评估和改进大型语言模型中指令跟踪的多维约束框架

摘要:接下来的指令评估了大型语言模型(LLMs)生成符合用户定义约束的输出的能力。 然而,现有的基准测试通常依赖于模板化的约束提示,缺乏现实使用的多样性,并限制了细粒度的性能评估。 为了填补这一空白&…

Chromium 浏览器核心生命周期剖析:从 BrowserProcess 全局管理到 Browser 窗口实例

在 Chromium 浏览器架构中,BrowserProcess 和 Browser 是两个核心类,分别管理 浏览器进程的全局状态 和 单个浏览器窗口的实例。它们的生命周期设计直接影响浏览器的稳定性和资源管理。以下是它们的详细生命周期分析: 1. BrowserProcess 的生…

易境通海外仓系统:一件代发全场景数字化解决方案

随着全球经济一体化和消费升级,一件代发业务的跨境电商市场规模持续增长。然而,一件代发的跨境运营也面临挑战,传统海外仓管理模式更因效率低下、协同困难成为业务扩张的瓶颈。 一、一件代发跨境运营痛点 1、多平台协同:卖家往往…

【Python训练营打卡】day30 @浙大疏锦行

DAY 30 模块和库的导入 知识点回顾: 1. 导入官方库的三种手段 2. 导入自定义库/模块的方式 3. 导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何…

仿腾讯会议——添加音频

1、实现开启或关闭音频 2、 定义信号 3、实现开始暂停音频 4、实现信号槽连接 5、回收资源 6、初始化音频视频 7、 完成为每个人创建播放音频的对象 8、发送音频 使用的是对象ba,这样跨线程不会立刻回收,如果使用引用,跨线程会被直接回收掉&a…

虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系

虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level Blueprint)的关系 code review! 参考笔记: 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图&…

MTK zephyr平台:系统休眠流程

一、概述: 当内核没有需要调度的东西时,就会进入空闲状态。 CONFIG_PM=y时允许内核调用PM subsys,将空闲系统置于支持的电源状态之一。 Application负责设置唤醒事件,该事件通常是由SoC外围模块触发的中断,例如: SysTick、RTC、计数器、GPIO 并非所有外设在所有电源模式…