图像的几何变换(缩放、平移、旋转)

news2025/1/23 7:16:47

图像的几何变换

学习目标

  • 掌握图像的缩放、平移、旋转等
  • 了解数字图像的仿射变换和透射变换

1 图像的缩放

缩放是对图像的大小进行调整,即 使图像放大或缩小

cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)

参数:

  • src :输入图像
  • dsize ;绝对尺寸 ,直接指定调整后图像的大小
  • fx,fy :相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
  • interpolation: 插值方法
  • 在这里插入图片描述

代码实现

import cv2 as cv
#读取图片

img1 = cv.imread('lena.png')

#图像的缩放

#法1    :绝对尺寸

rows, cols = img1.shape[:2]
res  = cv.resize(img1 , (2*cols,2*rows),interpolation=cv.INTER_CUBIC)

#法二  :相对尺寸
res1 = cv.resize(img1,None,fx=0.5,fy=0.5)

#图像显示
cv.imshow("original",img1)
cv.imshow("enlarge",res)
cv.imshow("shrink",res1)
cv.waitKey(0)

结果展示

在这里插入图片描述

2图像的平移

在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']

#读取图像
img1 = cv.imread("lena.png")

#图像的平移
rows ,cols = img1.shape[:2]
M= np.float32([[1,0,100],[0,1,50]])   #平移矩阵
dst = cv.warpAffine(img1,M,(cols,rows))

#图像的显示
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(7,4),dpi=100)
axes[0].imshow(img1[:,:,::-1])
axes[0].set_title("原图")

axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("平移后的结果")
plt.show()

结果展示

在这里插入图片描述

3 图像的旋转

在这里插入图片描述

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

代码实现

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]
#生成旋转矩阵
M = cv.getRotationMatrix2D((cols/2 ,rows/2),90,1)
#进行旋转变换
dst = cv.warpAffine(img,M,(cols,rows))


#图像展示
fig ,axes = plt.subplots(nrows=1,ncols=2,figsize=(5,4),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")

axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("旋转后的结果")

plt.show()

M = cv.getRotationMatrix2D((cols/2 ,rows/2),90,1)

  • cols/2 ,rows/2 :旋转中心
  • 90 : 逆时针旋转角度
  • 1:缩放比例(不进行缩放)

结果展示

在这里插入图片描述

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

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

相关文章

机构企业学员培训知识付费小程序开源版开发

机构企业学员培训知识付费小程序开源版开发 用户注册与登录:提供用户注册和登录功能,以便用户能够访问和使用小程序。个人信息管理:允许用户管理个人资料,包括修改个人信息和上传个人头像。课程浏览:提供课程列表&…

[技术讨论]讨论问题的两个基本原则——17年前的文字仍然有效

前两天又有人找我讨论问题,而且是他自己的项目,内容与我没有任何关系,他说的,却是讨论。 其实就是想来做咨询,又不想付费。 今天看到了十七年前写的这篇文字,就重发一下了,当然有少量文字修订&a…

【Java并发】聊聊ReentrantReadWriteLock锁降级和StampedLock邮戳锁

面试题 1.你说你用过读写锁,锁饥饿问题是什么? 2.有没有比读写锁更快的锁? 3.StampedLock知道吗?(邮戳锁/票据锁) 4.ReentrantReadWriteLock有锁降级机制策略你知道吗? 在并发编程领域,有多线程进行提升整体性能&…

c++ - 抽象类 和 多态当中一些问题

抽象类 纯虚函数 在虚函数的后面写上 0 ,则这个函数为纯虚函数。 class A { public:virtual void func() 0; }; 纯虚函数不需要写函数的定义,他有类似声明一样的结构。 抽象类概念 我们把具有纯虚函数的类,叫做抽象类。 所谓抽象就是&a…

124个Python案例,完整源代码!

大家好,我是涛哥。 很多小伙伴为了掌握爬虫这门技术,投入了大量的时间和精力。他们在深夜里独自码字,他们在周末的时候熟读代码, 但独自学习,没有朋友的陪伴和指导,学习的过程就像是在一条无尽的道路上徘…

【多线程】wait 、notify 和 notifyAll 讲解

wait 、notify 和 notifyAll 讲解 一. wait二. wait 和 sleep 的对比三. notify四. notifyAll五. notify 与 notifyAll 的原理 由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序. 完成这个…

军队状态出现的六种结果,是将帅的过失

军队状态会出现六种坏结果,是将帅的过失 【安志强趣讲《孙子兵法》第35讲】 【原文】 故兵有走者,有弛者,有陷者,有崩者,有乱者,有北者。凡此六者,非天之灾,将之过也。 【趣讲白话】…

【代码分析】初学解惑C++:函数适配器

文章目录 前置知识 运算符的重载“()”一、函数适配器是什么?由遇到的问题引出适配器模式类模式对象模式例1例2例3例4二、实现函数适配器1.定义函数2.定义函数适配器3.使用函数适配器 三、带模板的函数适配器1、自定义unary_function2、改写带…

alibaba按关键字搜索商品 API

为了进行电商平台 的API开发,首先我们需要做下面几件事情。 1)开发者注册一个账号 2)然后为每个alibaba应用注册一个应用程序键(App Key) 。 3)下载alibaba API的SDK并掌握基本的API基础知识和调用 4)利…

vue3中,调接口,渲染数据

1. 封装接口文档 // src/apis/xxx.js中 // 1. 导入 封装的axios实例 import request from /utils/http // 2. 封装接口 --获取轮播图数据 export const getBannerAPI (params {})>{// 传默认参数->(传参 默认参数)const { distributionSite…

Reids的安装使用

Windows 版本的 Redis 是 Microsoft 的开源部门提供的 Redis. 这个版本的 Redis 适合开发人员学习使用,生产环境中使用 Linux 系统上的 Redis, 这里讲解了这两种的安装和下载。按照你们需要的liunx 或window步骤来 就可以了(也可以留言,后面看…

c++ explicit关键作用

explicit 概念引入1.explicit 介绍1.1 显示调用和隐式调用1.2 explicit意义 概念引入 构造函数不仅可以构造并初始化对象,对于具有单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换作用。 而explicit关键字,恰恰可…

useGetState自定义hooks解决useState 异步回调获取不到最新值

setState 的两种传参方式 1、直接传入新值 setState(options); const [state, setState] useState(0); setState(state 1); 2、传入回调函数 setState(callBack); const [state, setState] useState(0); setState((prevState) > prevState 1); // prevState 是改变之…

BUUCTF reverse2 1

使用die查看文件信息,发现是ELF64位程序, 也就是说这是linux上的运行程序 再linux上运行 使用IDA64打开文件 F5 反编译 可以看到这里和flag进行对比 点击flag 点击这个7Bh,然后按r flag出来了 {hacking_for_fun}加上flag头提交 flag{h…

Python入门教程35:使用email模块发送HTML和图片邮件

smtplib模块实现邮件的发送功能,模拟一个stmp客户端,通过与smtp服务器交互来实现邮件发送的功能,可以理解成Foxmail的发邮件功能,在使用之前我们需要准备smtp服务器主机地址、邮箱账号以及密码信息。 #我的Python教程 #官方微信公…

用Canape配置VX1000的工程,在DA中绘制各个传感器目标的方法

参考本文档可帮助读者,快速安装VX1000软件,根据自己的需求,实现传感器目标在canape中DA的绘制。 介绍 Driver assistance (DA)系统是通过各种传感器(如视频、雷达、激光雷达等)获取有关车辆环境的信息。根据传感器对物体检测的结果(例如与前方车辆的距离)对驾驶员发…

《C++ Core Guidelines解析》:揭示现代C++最佳实践的深层原理

本书旨在深入解析C Core Guidelines,这是C社区中权威的编程指南。我们将探索其中所包含的现代C最佳实践,从底层原理和设计理念角度剖析其背后的思想。通过对Guidelines的逐条解析和实例说明,读者将深入理解如何编写更安全、高效和可维护的C代…

滑动窗口的最大值(双端队列,单调队列)

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public int[] maxSlidingWindow(int[] nums, int k) {LinkedList<Integer> deque new LinkedList<>();//双端队列&#xff0c;存储单调队列的下标int ans[] new int[nu…

Android Studio 导入工程Gradle和JDK配置修改工程名称修改包名

一、Gradle 配置 经常遇到导入的工程却编译不过&#xff0c;很多情况下就是因为配置不一样导致有问题&#xff0c;主要有两个配置&#xff1a; Android Gradle Plugin Version Gradle Version 找一个能正常运行的项目&#xff0c;把它两配置成一样&#xff0c;一般都能解决问…

openssl命令行:RSA的用法-- 终极版

1、生成密钥 openssl genrsa -out test2048_priv.pem 2048 openssl rsa -pubout -in test2048_priv.pem -out test2048_pub.pem openssl genrsa -out test3072_priv.pem 3072 openssl rsa -pubout -in test3072_priv.pem -out test3072_pub.pem openssl genrsa -out test4096…