【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度
在这里插入图片描述

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

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

相关文章

idea__SpringBoot微服务03——yaml(新注解)(新的依赖)

yaml 一、数据格式二、注入配置文件(yaml注入)(新注解ConfigurationProperties)三、注入配置文件(properties注入)(新注解PropertySource)四、yaml配置文件占位符${}五 、yaml跟prop…

kettle作业发送@163邮件

版本:20231207 用kettle做一个简单的邮件发送 使用模块 start、转换、邮件 在start设置好你需要的时间 在转换中随便添加一个你之前保存的一个任务 重点在邮件设置上 1.邮件的地址 2.邮件的服务器 这里最重要的一点就是发件人验证的第三方接入密码,这…

WEB组态编辑器(BY组态)介绍

BY组态是一款非常优秀的纯前端的【web组态插件工具】,可无缝嵌入到vue项目,react项目等,由于是原生js开发,对于前端的集成没有框架的限制。同时由于BY组态只是一个插件,不能独立运行,必须嵌入到你方软件平台…

国科大超大规模集成电路设计针对期末考试的复习

基本概念 物理综合Physical synthesis 从RTL代码创建正确的布局布线电路,相当于跳过了逻辑门级表示,直接从数据流阶段到了版图阶段。 等效门equivalent gate 一个等效门是指一个二输入的与非门,这里的等效不是指功能上的等效,而是芯片面积…

深度学习疫情社交安全距离检测算法 - python opencv cnn 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖,适合作为竞赛…

Android hook式插件化详解

引言 Android插件化是一种将应用程序的功能模块化为独立的插件,并动态加载到主应用程序中的技术。通过插件化,开发者可以将应用程序的功能分解成独立的模块,每个模块可以作为一个插件单独开发、测试和维护,然后通过动态加载的方式集成到主应用程序中,实现功能的动态扩展和…

功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?

软件测试是一个广义的概念,他包括了多领域的测试内容,比如,很多新手可能都听说:功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试等&#…

CentOS系统中设置反向代理服务器的步骤

在CentOS系统中设置反向代理服务器可以帮助你隐藏原始服务器的细节,并提高服务器的安全性。以下是在CentOS系统中设置反向代理服务器的步骤概述: 安装反向代理软件: 常见的反向代理软件包括Nginx和Apache。你可以选择其中之一来作为你的反向…

【Git】error:failed to push some refs to ‘git@gitee.com:name/project.git‘

错误展示 今天在版本回退的时候,推送到gitee显示如下错误 先执行了git pull origin master,然后再执行push操作,也没有用 解决办法 执行git push -f origin master ,-f 表示强制推送。 结果 问题解决啦!

区分node,npm,nvm

目录 一,nodejs二,npm三,nvm 区分node,npm,nvm 几年前学习前端的时候学习的就是htmlcssjs 三件套。 现在只学习这些已经不能满足需要了。 一,nodejs nodejs是编程语言javascript运行时环境。(比…

项目架构-六边形架构的概述和实现

使用传统的分层架构,我们的所有依赖项都指向一个方向,上面的每一层都依赖于下面的层。传输层将依赖于交互器,交互器将依赖于持久层。 在六边形架构中,所有依赖项都指向内部——我们的核心业务逻辑对传输层或数据源一无所知。尽管如…

【深度学习】强化学习(一)强化学习定义

文章目录 一、强化学习问题1、交互的对象1. 智能体(Agent)2. 环境(Environment) 2、强化学习的基本要素1. 状态 𝑠2. 动作 𝑎3. 策略 𝜋(𝑎|𝑠)4. 状态转移概率 &#x1…

人工智能企业引入S-SDLC,推动安全能力大跃升,保障AI技术体系深化落地

某人工智能公司是国际知名的上市企业,核心技术处于世界前沿水平。多年来,该企业在智慧教育、智慧医疗、智慧城市、智慧司法、金融科技、智能汽车、运营商、消费者等领域进行深度技术赋能,深入推进各个行业的智能化、数字化转型建设。 人工智能…

【开源】基于Vue+SpringBoot的智慧家政系统

项目编号: S 063 ,文末获取源码。 \color{red}{项目编号:S063,文末获取源码。} 项目编号:S063,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服…

简单实现Spring容器(一)

阶段1: 编写自己的Spring容器,实现扫描包,得到bean的class对象.思路: 使用 ElfSpringConfig.java 替代beans.xml文件作为配置文件,从中获取到: 1.扫描包,得到bean的class对象. 2.排除包下不是bean的 1.容器文件 ElfSpringApplicationContext.java 核心!!! package com.elf…

vuepress-----13、分割config

13、分割config config.js const headConfig require(./config/headConfig); const pluginsConfig require(./config/pluginsConfig); const themeConfig require(./config/themeConfig)module.exports {title: "小邵子",description: 小邵子的个人笔记,head: he…

Mybatis一级缓存与二级缓存

一、简介 数据库接收到sql语句后,需要词法/语法解析,优化sql语句,制定执行计划。多数情况下,相同的sql语句可能只是传入参数不同(如where条件后的值不同...)。 如果每次都需要经过上面的 词法/语法解析、语…

java基础之异常处理

1、概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 2、异常发生的原因 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断,或者JVM内存溢出。 3、三种类型的异常 检查性异常:…

Unity UGUI TextMeshPro实现输入中文和表情包(Emoji)表情

目录 实现中文显示 准备工作 1、打开Window——TextMeshPro——FontAssetCreator 2、把字体文件放入SourceFont中 3、把CharacterSet改为Characters from File 4、把字体库文件放入Characters File 5、设置好参数点击Generate Font Atlas等待完成后保存 6、把生成后保存…

科普小知识-3D 打印是什么?

3D 打印是什么?作为近年来备受关注的前沿科技,3D 打印技术正在不断改变着制造业、医疗领域、艺术设计等多个领域的面貌。其又被称为增材制造,是一种通过电脑设计,逐层堆叠材料来创建三维物体的技术。 3D 打印的基本原理 3D 打印…