opencv实现仿射变换

2023-09-21 19:21:51

什么是仿射变换?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

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]获取的图像的行数和列数,用于指定仿射变换结果的大小。

效果展示

在这里插入图片描述

更多推荐

Understanding the Security of ARM Debugging Features【TEE安全】

文章目录摘要引言贡献背景ARM、SoC制造商和OEMARM调试体系结构ARM调试验证信号ARMCoreSight体系结构ARM安全扩展调试体系结构的安全含义非侵入式调试侵入式调试总结调试真实设备中的身份验证信号目标设备开发板IOT设备商业云平台移动设备身份验证信号的状态身份验证信号的管理我们从TRM中学到了什么:我们从

Hbase工作原理

Hbase:HBase底层原理详解(深度好文,建议收藏)-腾讯云开发者社区-腾讯云Hbase架构图同一个列族如果有多个store,那么这些store在不同的regionHbase写流程(读比写慢)MemStoreFlushHbase读流程:先读blockCache,若命中了结果,则不读磁盘;若没有命中结果,那么同时读M

大数据驱动业务增长:数据分析和洞察力的新纪元

文章目录大数据的崛起大数据的特点大数据技术大数据驱动业务增长1.洞察力和决策支持2.个性化营销3.风险管理4.产品创新大数据分析的新纪元1.云计算和大数据示例代码:使用AWS的ElasticMapReduce(EMR)进行大数据分析。2.人工智能和机器学习示例代码:使用Python的Scikit-Learn库进行机器学

外国固定资产管理系统功能有哪些

很多公司都在寻找提高自己资产管理效益的方法。为了满足这一要求,国外的固定资产管理系统已经发展成多种形式。以下是国外一些常见的固定资产管理系统的特点:自动化和智能化:许多现代固定资产管理系统采用自动化和数字化技术,以简化流程,减少错误,提高数据准确性。这些系统通常包括电子库存管理、一键生成报告和实时跟踪资产位置。集成:国

机器学习:在线学习和离线学习区别

机器学习中的在线学习(OnlineLearning)和离线学习(OfflineLearning)是两种不同的学习方式,它们在数据处理和模型更新方面有着明显的区别。以下是它们的主要区别:数据获取方式:在线学习:在在线学习中,模型是不断地从数据流中接收新的样本并进行学习。这意味着模型会随着时间的推移不断更新,以适应新的数据

深度学习:pytorch nn.Embedding详解

目录1nn.Embedding介绍1.1nn.Embedding作用1.2nn.Embedding函数描述1.3nn.Embedding词向量转化2nn.Embedding实战2.1embedding如何处理文本2.2embedding使用示例2.3nn.Embedding的可学习性1nn.Embedding介绍1.1

【SpringMVC】自定义注解

【SpringMVC】自定义注解前言1.什么是注解?2.注解的用处3.注解的原理1.1.@Override1.2.@SuppressWarnings2.JDK元注解2.1.@Retention2.2.@Target2.3.@Inherited2.4.@Documented3.自定义注解3.1.自定义注解的分类注解类结语

Map<K,V>的使用和List学习

MapMap是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。对于静态类型的查找来说,一般直接遍历或者用二分查找【不会对区间进行插入和删除操作】而在现实生活中的查找比如:根据姓名查询考试成绩通讯录,即根据姓名查询联系方式不重复集合,即需要先搜索关键字是否已经在集合中注:Map最重要的特性就

【Redis】深入探索 Redis 的数据类型 —— 列表 List

文章目录一、List类型介绍二、List类型相关命令2.1LPUSH和RPUSH、LPUSHX和RPUSHX2.2LPOP和RPOP、BLPOP和BRPOP2.3LRANGE、LINDEX、LINSERT、LLEN2.4列表相关命令总结三、List类型内部编码3.1压缩列表(ziplist)3.2链表(linkedli

ceph分布式存储

目录一、概述二、组件三、架构图四、搭建一、概述ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。特点:1.统一存储虽然ceph底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口。所以在开源存储软件中,能够一统江湖。至于能不能千秋万代,就不知了。2.高扩展性扩容方便、容量大。能够

前端Vue3+element-plus表单输入框实现Cron表达式校验

页面如下:本来想手写正则表达式校验,结果发现很麻烦,cron表达式组成如下:开发使用框架为vue3+element-plus,于是选择cron-validator依赖。使用步骤如下:1、通过npminstallcron-validator命令安装:2、可以通过package.json文件中看到,已安装成功。3、在你需要

热文推荐