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

【python、opencv】opencv仿射变换原理及代码实现

opencv仿射变换原理

仿射变换是opencv的基本知识点,主要目的是将原始图片经过仿射变换矩阵,平移、缩放、旋转成目标图像。用数学公式表示就是坐标转换。
在这里插入图片描述
其中x,y是原始图像坐标,u,v是变换后的图像坐标。将公式转换为齐次坐标矩阵:

在这里插入图片描述
下面用常见的仿射变换来解释一下具体变换过程。

常见的仿射变换形式

蓝色为原始图像,橙色为变换后图像。

平移

在这里插入图片描述

缩放

在这里插入图片描述

旋转

在这里插入图片描述

具体代码解析

总述

opencv的cv2.warpAffine函数用来进行仿射变换,其具体参数为:

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

src: 输入图像。
M: 变换矩阵,是一个 2x3 的矩阵。
dsize: 输出图像的大小,是一个二元组 (width, height)。
dst (可选): 输出图像,可以是预先创建的空白图像。
flags (可选): 插值方法的标志。可以是以下之一:
cv2.INTER_LINEAR: 线性插值(默认)。
cv2.INTER_NEAREST: 最近邻插值。
cv2.INTER_CUBIC: 三次样条插值(用于放大)。
cv2.INTER_AREA: 区域插值(用于缩小)。
等等。
borderMode (可选): 边界模式,用于处理超出边界的像素。可以是以下之一:
cv2.BORDER_CONSTANT: 常量填充。
cv2.BORDER_REPLICATE: 复制边界像素。
cv2.BORDER_REFLECT: 反射边界。
cv2.BORDER_WRAP: 包裹边界。
等等。
borderValue (可选): 当使用常量填充时的边界值,默认为 0。

要求知道上述仿射变换矩阵M,由于最后一行固定是001,因此变量M只有6个变量2X3。
通常在opencv中使用两种方法来求取仿射变换矩阵,分别是cv2.getAffineTransformcv2.getRotationMatrix2D

cv2.getAffineTransform

3点法,也叫方程法,通过不共线的3个点确定仿射变换矩阵。

import numpy as np
src = np.array([[0, 0], [100, 0], [0, 100]], np.float32) # 源图像坐标
dst = np.array([[0, 0], [50, 0], [0, 50]], np.float32) # 转换后图像坐标
M = cv2.getAffineTransform(src, dst)
print(M)
'''
[[0.5 0.  0. ] [0.  0.5 0. ]]
'''

原始图像3个点为src,变换后的3个点名为dst,从数字也能看出来,这个变换就是x,y缩小一半。

cv2.getRotationMatrix2D

旋转矩阵法,通过指定旋转中心和旋转角度来自动求取变换矩阵。

M = cv2.getRotationMatrix2D((256, 256), 30, 1)
print(M)

上面代码意思是以256,256为中心逆时针旋转30度,缩放比例设置为1.

代码及效果图

img = cv2.imread("00000.png")
H,W,C = img.shape
warpimg = cv2.warpAffine(img,M,(W,H)) ##M为上面两种方式求的矩阵
cv2.imshow("ori",img)
cv2.imshow("out",warpimg)
cv2.waitKey(0)

矩阵1:缩放
在这里插入图片描述
矩阵2:旋转30度
在这里插入图片描述

相关文章:

【python、opencv】opencv仿射变换原理及代码实现

opencv仿射变换原理 仿射变换是opencv的基本知识点,主要目的是将原始图片经过仿射变换矩阵,平移、缩放、旋转成目标图像。用数学公式表示就是坐标转换。 其中x,y是原始图像坐标,u,v是变换后的图像坐标。将公式转换为…...

mac本地部署stable-diffusion

下载Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ①输入“1”选择中科大版本,然后输入Y(YES),直接输入开机密码(不显示)然后回车确认,开始下载 ②…...

dockers安装rabbitmq

RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQhttps://www.rabbitmq.com/ Downloading and Installing RabbitMQ — RabbitMQ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 之后参照:dock…...

07、pytest指定要运行哪些用例

官方用例 # 目录结构 | |----test_mod.py | |----testing||----test_dir.py# content of test_mod.py import pytestdef func(x):return x 1def test_mod():print("test_mod function was invoked")assert func(3) 5def test_func():print("test_func was in…...

springboot集成cxf

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…...

快速认识什么是:Kubernetes

每次谈到容器的时候&#xff0c;除了Docker之外&#xff0c;都会说起 Kubernetes&#xff0c;那么什么是 Kubernetes呢&#xff1f;今天就来一起学快速入门一下 Kubernetes 吧&#xff01;希望本文对您有所帮助。 Kubernetes&#xff0c;一种用于管理和自动化云中容器化工作负…...

YOLOv6 学习笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、YOLOv6贡献和改进二、YOLOv6核心概念三、YOLOv6架构改进四、YOLOv6重参思想五、YOLOv6的损失函数总结 前言 在计算机视觉领域&#xff0c;目标检测技术一直…...

paypal贝宝怎么绑卡支付

一、PayPal是什么 PayPal是一个很多国家地区通用的支付渠道&#xff0c;我们可以把它理解为一项在线服务&#xff0c;相当于美国版的支付宝。你可以通过PayPal进行汇款和收款&#xff0c;相比传统的电汇和西联那类的汇款方式&#xff0c;PayPal更加简单和容易&#xff0c;被很…...

活动回顾|德州仪器嵌入式技术创新发展研讨会(上海站)成功举办,信驰达科技携手TI推动技术创新

2023年11月28日&#xff0c;德州仪器(TI)嵌入式技术创新发展研讨会在上海顺利举办。作为TI中国第三方IDH&#xff0c;深圳市信驰达科技有限公司受邀参加&#xff0c;并设置展位&#xff0c;展出CC2340系列低功耗蓝牙模块及TPMS、蓝牙数字钥匙解决方案&#xff0c;与众多业内伙伴…...

Vue 循环走马灯

1、使用 transform: translateX()&#xff0c;循环将滚动内容在容器内偏移&#xff0c;超出容器部分隐藏&#xff1b; 2、避免滚动到末尾时出现空白&#xff0c;需要预留多几个。 3、一次循环偏移的距离scrollLoopWidth 可能受样式影响需要做些微调&#xff0c;比如单个item的…...

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(3)》(27)

《Linux操作系统原理分析之Linux文件管理&#xff08;3&#xff09;》&#xff08;27&#xff09; 8 Linux文件管理8.6 文件管理和操作8.6.1 系统对文件的管理8.6.2 进程对文件的管理 8 Linux文件管理 8.6 文件管理和操作 8.6.1 系统对文件的管理 Linux 系统把所有打开的活动…...

【华为数据之道学习笔记】3-2 基础数据治理

基础数据用于对其他数据进行分类&#xff0c;在业界也称作参考数据。基础数据通常是静态的&#xff08;如国家、币种&#xff09;&#xff0c;一般在业务事件发生之前就已经预先定义。它的可选值数量有限&#xff0c;可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…...

GO设计模式——7、适配器模式(结构型)

目录 适配器模式&#xff08;Adapter Pattern&#xff09; 优缺点 使用场景 注意事项 代码实现 适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。将一个类的接口转化为客户希望的…...

Java实现TCP一对一通信,实现UDP群聊通信

TCP一对一通信: 实现服务端对话框&#xff1a; 其中可自由更改对话框的样式 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class QqMain extends JFrame implements ActionListener{public static void …...

Vue + Element 实现按钮指定间隔时间点击

1、业务需求 需要加一个按钮&#xff0c;调用第三方API&#xff0c;按钮十分钟之内只能点击一次&#xff0c;刷新页面也只能点击一次 2、思路 加一个本地缓存的时间戳&#xff0c;通过时间戳计算指定时间内不能点击按钮 3、实现 1&#xff09;vue页面 <template>&l…...

UE Websocket笔记

参考链接 [UE4 C入门到进阶]12.Websocket网络通信 - 哔哩哔哩 包含怎么用Nodejs 写测试服务器 UE4_使用WebSocket和Json&#xff08;上&#xff09; - 知乎 包含Python写测试服务器 UE4_使用WebSocket和Json&#xff08;下&#xff09; - 知乎 示例代码 xxx.Build.cs"W…...

STM32h7 接收各种can id情况下滤波器的配置

1、接收所有数据 /* 此处id2都为0&#xff0c;不进行id校验&#xff0c;接收所有数据*/ static void CAN_Filter_Config(void){FDCAN_FilterTypeDef sFilterConfig1;/* Configure Rx filter */sFilterConfig1.IdType FDCAN_STANDARD_ID;sFilterConfig1.FilterIndex 0;sFilte…...

《深入理解计算机系统》学习笔记 - 第三课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…...

总结:服务器批量处理http请求的大致流程

总结&#xff1a;服务器批量处理http请求的大致流程 一客户端发起请求&#xff1a;可以多个请求同时发送二Web服务器解析请求&#xff08;如&#xff1a;Nginx&#xff09;&#xff1a;可以多个请求同时解析三Servlet容器接收请求&#xff08;如&#xff1a;tomcat&#xff09;…...

算法通关村第十八关-青铜挑战回溯是怎么回事

大家好我是苏麟 , 今天聊聊回溯是怎么个事 . 回溯是最重要的算法思想之一&#xff0c;主要解决一些暴力枚举也搞不定的问题&#xff0c;例如组合、分割、子集、排列&#xff0c;棋盘等。从性能角度来看回溯算法的效率并不高&#xff0c;但对于这些暴力都搞不定的算法能出结果就…...

大数据运维 | 项目一:大数据分布式集群搭建全攻略

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 前言 作为一名大数据运维工程师&#xff0c;你是否遇到过这样的问题&#xff1a; 问题场景描述1机器A可正常上网&#xff0c;但机器B无法连接网…...

TEA加密算法实战:用Python和C语言实现QQ同款加密(附完整代码)

TEA加密算法实战&#xff1a;从原理到跨语言实现 在即时通讯和物联网设备中&#xff0c;数据安全传输一直是核心需求。TEA&#xff08;Tiny Encryption Algorithm&#xff09;以其轻量级、高效率的特性&#xff0c;成为资源受限环境下的理想选择。本文将深入探讨TEA算法家族的工…...

FanControl风扇控制软件:从噪音困扰到静音享受的完整指南

FanControl风扇控制软件&#xff1a;从噪音困扰到静音享受的完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

Unity引擎开发过的VR大场景项目网络技术,资源处理及热更新方案的报价大概多少

根据最新的市场招标数据、行业报价案例和技术方案分析&#xff0c;针对VR大场景项目的网络技术、资源处理、热更新方案三大模块的报价&#xff0c;整理如下&#xff1a;一、网络技术方案报价 网络技术方案主要解决多人在线同步、远程渲染、低延迟通信等问题。方案类型技术选型报…...

解锁Switch模拟潜能:Ryujinx架构深度解析与实战优化

解锁Switch模拟潜能&#xff1a;Ryujinx架构深度解析与实战优化 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx作为一款采用C#开发的开源Nintendo Switch模拟器&#xff0c;通…...

Mojo 1.2正式版发布后,Python互操作API发生3处破坏性变更——紧急迁移指南与向下兼容降级方案(含自动转换脚本)

第一章&#xff1a;Mojo 1.2互操作API破坏性变更全景概览Mojo 1.2 版本对与 Python、C/C 及系统原生库的互操作接口进行了深度重构&#xff0c;核心目标是提升类型安全性和运行时性能&#xff0c;但由此引入了多项不兼容的破坏性变更。开发者在升级至 1.2 时必须审慎评估现有绑…...

牛顿-拉夫逊法在电力系统中的5个常见误区:从Matpower仿真结果反推算法原理

牛顿-拉夫逊法在电力系统中的5个常见误区&#xff1a;从Matpower仿真结果反推算法原理 当你在Matpower中运行潮流计算时&#xff0c;是否遇到过迭代不收敛的报错&#xff1f;那些看似简单的"Maximum number of iterations reached"警告背后&#xff0c;往往隐藏着对牛…...

ms-swift微调框架入门:快速掌握LoRA微调与模型合并技巧

ms-swift微调框架入门&#xff1a;快速掌握LoRA微调与模型合并技巧 1. 引言 在当今大模型技术快速发展的背景下&#xff0c;如何高效地对大型语言模型进行微调成为了许多开发者和研究者的关注焦点。ms-swift作为一款强大的微调框架&#xff0c;提供了丰富的功能和技术支持&am…...

OpenClaw 底层原理分析

OpenClaw 底层原理深度分析 OpenClaw 是一个智能体编排平台,它的核心设计哲学是 “模型无关、工具优先、记忆驱动”。让我从架构、数据流、核心机制三个维度为你拆解。 🏗️ 一、整体架构 OpenClaw 采用 分层解耦 架构,可以理解为“AI 操作系统”: text ┌──────…...

OpenClaw+Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF:学术论文辅助写作系统

OpenClawQwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF&#xff1a;学术论文辅助写作系统 1. 为什么需要AI辅助学术写作 去年冬天&#xff0c;我在赶一篇计算机视觉领域的会议论文时&#xff0c;经历了所有研究者都熟悉的痛苦&#xff1a;连续三天熬夜整理参考文献、…...