opencv实现仿射变换和透射变换

##1, 什么是仿射变换?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt#设置字体
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']#图像的读取
img = cv.imread("lena.png")#仿射变换
rows , cols = img.shape[:2]#创建变换矩阵
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)#完成仿射变换
dst = cv.warpAffine(img,M,(cols,rows))#图像的显示
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("放射后结果")
plt.show()

代码讲解

首先,导入所需的库:import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
然后,读取图像:img = cv.imread("lena.png")
这里假设存在名为"lena.png"的图像文件,使用cv.imread()函数将其读取为一个NumPy数组对象,并赋值给变量img。接下来,定义仿射变换所需的坐标点:pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
pts1是原图中的三个点的坐标,pts2是对应的目标仿射后的三个点的坐标。这里选择了两个三角形形状的区域作为示例。然后,通过这些坐标点获取仿射变换的矩阵:M = cv.getAffineTransform(pts1,pts2)
使用cv.getAffineTransform()函数根据这两组对应的点,计算得到仿射变换的矩阵,赋值给变量M。接着,进行仿射变换操作:dst = cv.warpAffine(img,M,(cols,rows))
使用cv.warpAffine()函数对图像进行仿射变换,将原图img和变换矩阵M作为参数传入,得到仿射后的结果赋值给变量dst。最后,使用Matplotlib库显示原图和仿射后的结果:fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后结果")
plt.show()
通过创建一个包含2个子图的Figure对象,并调用imshow()函数分别在两个子图上显示原图和仿射后的结果。set_title()函数用于设置子图的标题。最后,使用plt.show()函数显示图像。注意,代码中的cols和rows是通过img.shape[:2]获取的图像的行数和列数,用于指定仿射变换结果的大小。

效果展示

在这里插入图片描述

2,什么是透射变换

在这里插入图片描述

在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pylab import mplmpl.rcParams['font.sans-serif'] = ['SimHei']img = cv.imread("lena.png")
rows, cols, _ = img.shapepts1 = np.float32([[50, 50], [200, 50], [50, 200], [200, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250], [200, 200]])T = cv.getPerspectiveTransform(pts1, pts2)
dst = cv.warpPerspective(img, T, (cols, rows))fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("原图")
axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title("透视变换后的结果")
plt.show()

结果展示

在这里插入图片描述

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

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

相关文章

clickhouse简单安装部署

目录 前言(来源于官方文档): 一.下载并上传 1.下载地址:点我跳转下载 2.上传至Linux 二.解压和配置 1.解压顺序 注意:必须按照以下顺序解压,并且每解压一个都要执行该解压后文件的install/doinst.sh文件 解压步骤&#xff…

Mycat管理及监控

Mycat管理 -h 是你自己的ip地址 相关命令及含义 Mycat-eye(图形化界面监控) 仅限于Linux系统

基于Xml方式Bean的配置-初始化方法和销毁方法

SpringBean的配置详解 Bean的初始化和销毁方法配置 Bean在被实例化后&#xff0c;可以执行指定的初始化方法完成一些初始化的操作&#xff0c;Bean在销毁之前也可以执行指定的销毁方法完成一些操作&#xff0c;初始化方法名称和销毁方法名称通过 <bean id"userService…

Spring Boot 日志文件

前言 本篇博客主要介绍自定义的日志打印、日志的级别高低、如何保存日志等等..... 一、日志是什么&#xff1f;日志有什么用&#xff1f; 日志就是我们控制台上输出的内容&#xff0c;控制台上的输出的信息就是日志信息&#xff0c;如下所示&#xff1a; 日志有什么用&#x…

【Vue2.0源码学习】生命周期篇-挂载阶段

文章目录 1. 前言2. 挂载阶段分析3. 总结 1. 前言 模板编译阶段完成之后&#xff0c;接下来就进入了挂载阶段&#xff0c;从官方文档给出的生命周期流程图中可以看到&#xff0c;挂载阶段所做的主要工作是创建Vue实例并用其替换el选项对应的DOM元素&#xff0c;同时还要开启对…

c语言基础知识+OS+数据结构

c语言&#xff1a; memory section&#xff1a; .bss&#xff1a; uninitialized or zero-initialized global and static variables .data: initialized global and static variables .text: Read only, code and const C语言编译流程&#xff1a; pre-compiler: …

在创业公司,我靠它续命 ...

不知不觉就在新公司工作了一周&#xff0c;没有想象中那么难受。创业公司里没有复杂的人际关系&#xff0c;也没有无聊的会议&#xff0c;更没有复杂的流程。每天上班第一件事就是开个小会&#xff0c;可能是站着开&#xff0c;也可能是连麦开。大家简单过一下前一天的进度&…

vue-cli创建项目、vue项目目录结(运行vue项目)、ES6导入导出语法、vue项目编写规范

vue-cli创建项目、vue项目目录结构、 ES6导入导出语法、vue项目编写规范 1 vue-cli创建项目 1.1 vue-cli 命令行创建项目 1.2 使用vue-cli-ui创建 2 vue项目目录结构 2.1 运行vue项目 2.2 vue项目的目录结构 3 es6导入导出语法 4 vue项目编写规范 4.1 修改项目 4.2 以后…

LabVIEW崩溃后所产生的错误日志文件的位置

LabVIEW崩溃后所产生的错误日志文件的位置 LabVIEW开发环境刚刚崩溃&#xff0c;请问我如何访问崩溃后自动生成的日志文件&#xff1f; LabVIEW崩溃后产生的转储文件位于何处&#xff1f; 代码导致了LabVIEW崩溃&#xff0c;请问哪些文件可以帮助NI技术支持了解具体原因&…

腾讯mini项目-【指标监控服务重构】2023-08-24

今日已办 Jeager 功能 监控分布式工作流程并排除故障识别性能瓶颈追踪根本原因分析服务依赖关系 部署 部署 Deployment — Jaeger documentation (jaegertracing.io) 支持 clickhouse jaegertracing/jaeger-clickhouse: Jaeger ClickHouse storage plugin implementation …

Python之列表

标题 列表什么是列表列表的创建列表的删除列表的访问 列表的常用方法append()、insert()、extend()pop()、remove()、clear()count()、index()list()、 filter()、 reduce()、lambda() 列表支持的运算加法运算符乘法运算符*成员测试运算符in 内置函数对列表的操作列表推导式列表…

Python 逢七拍手小游戏2.0

"""逢七拍手游戏介绍&#xff1a;逢七拍手游戏的规则是&#xff1a;从1开始顺序数数&#xff0c;数到有7&#xff0c;或者是7的倍数时&#xff0c;就拍一手。例如&#xff1a;7、14、17......70......知识点&#xff1a;1、循环语句for2、嵌套条件语句if/elif/e…

tensorrt获取输入输出

利用Netron打开onnx&#xff0c;右边名字&#xff1a; int input_index engine->getBindingIndex("inout1.1");int output_index engine->getBindingIndex("191");

010_第一代软件开发(二)

第一代软件开发(二) 文章目录 第一代软件开发(二)项目介绍界面布局功能完善快照功能获取可用串口播放按键提示音 关键字&#xff1a; Qt、 Qml、 QSerialPort、 QPixmap、 QSoundEffect 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff…

Java基础(一)——Hello World,8种数据类型,键盘录入

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

C++项目:仿muduo库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识&#xff08;一&#xff09;HTTP服务器1.概念 &#xff08;二&#xff09;Reactor模型&#xff1a;1.概念2.分类&#xff08;1&#xff09;单Reactor单线程&#xff1a;单I/O多路复用业务处理。&#xff08;2&#xff09;单Reactor多线程&…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

三子棋小游戏(简单详细)

设计总体思路 实现游戏可以一直玩&#xff0c;先打印棋盘&#xff0c;玩家和电脑下棋&#xff0c;最后分出胜负。 如果编写较大的程序&#xff0c;我们可以分不同模块 例如这个三子棋&#xff0c;我们可以创建三个文件 分别为&#xff1a; game.h 函数的声明game.c 函数…

MySQL简介以及安装和部署(Linux)

MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年&#xff0c;SUN又被Oracle以74亿美金收购。 目前MySQL被广泛地应用在Internet上的中小型网站中。由于体积小、速度快、总体拥有成本低&…