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

OpenCV-Python实战(8)——图像变换

一、缩放 cv2.resize()

img = cv2.resize(src=*,dsize=*,fx=*,fy=*,interpolation=*)

img:目标图像。

src:原始图像。

dsize:(width,height)图像大小。

fx、fy:可选参数,水平/垂直方向缩放比例。

interpolation:可选参数,进行缩放操作使用哪种方法对图像进行删减或增补,常用方法如下:

方法解释
INTER_NEAREST0最近插值法
INTER_LINEAR1双线性插值法
INTER_CUBIC2双三次插值法
INTER_AREA3
INTER_LENCZOS44Lencz的插值方法
import cv2lena = cv2.imread('Lena.png')img1 = cv2.resize(src=lena,dsize=(int(lena.shape[0]/2),int(lena.shape[1]/2)))
img2 = cv2.resize(src=lena,dsize=None,fx=.5,fy=0.5)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)cv2.waitKey(0)
cv2.destroyAllWindows()

二、翻转 cv2.flip()

img = cv2.flip(src=*,flipCode=*)

img:目标图像。

src:原始图像。

flipCode:翻转方式:

flipCode解释
0垂直翻转
1水平翻转
-1垂直与水平同时翻转
import cv2lena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]img1 = cv2.flip(src=lena,flipCode=0)
img2 = cv2.flip(src=lena,flipCode=1)
img3 = cv2.flip(src=lena,flipCode=-1)cv2.imshow('lena',lena)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)cv2.waitKey(0)
cv2.destroyAllWindows()

三、仿射 

M=\begin{bmatrix} M11 &M12 &M13 \\ M21 &M22 &M23 \end{bmatrix}

img(x,y)=src(M_{11}x + M_{12}y + M_{13} , M_{21}x + M_{22}y + M_{23})

img = cv2.warpAffine(src=*,M=*,dsize=*,flags=*,borderMode=*,borderValue=*)

img:目标图像。

src:原始图像。

M:3*2 变换矩阵,不同变换矩阵的仿射效果不同。

dsize:(width,height)新图像大小。

flags:进行仿射操作的插值方法。

borderMode:边界像素,默认为:BORDER_CONSTANT。

borderValue:边界填充值,默认为0。

3.1 平移

img(x,y)=src(1*x + 0*y + M_{13} , 0*x + 1*y + M_{23})

M=\begin{bmatrix} 1 &0 &M13 \\ 0 &1 &M23 \end{bmatrix}

表示图像向X轴方向平移 _{}M_{13},向Y轴方向平移 _{}M_{23}

import numpy as nplena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]x = 25
y = 25
M = np.float32([[1,0,x],[0,1,y]])
img = cv2.warpAffine(src=lena,M=M,dsize=lena.shape[:2])cv2.imshow('lena',lena)
cv2.imshow('img',img)cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 旋转 cv2.getRotationMatix2D()

M = cv2.getRotationMatrix2D(center=*,angle=*,scale=*)

center:旋转的中心点坐标(width,height)。

angle:旋转角度,正值(逆时针);负值(顺时针)。

scale:缩放比。

import cv2
import numpy as nplena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]w,h = lena.shape[:2]
M = cv2.getRotationMatrix2D(center=(w/2,h/2),angle=30,scale=1)
img = cv2.warpAffine(src=lena,M=M,dsize=lena.shape[:2])cv2.imshow('lena',lena)
cv2.imshow('img',img)cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 倾斜 cv2.getAffineTransform()

M = cv2.getAffineTransform(src=*,dst=*)

src:原始图像的三个定位点坐标。(可以是图像的任意三个角坐标)

dst:倾斜图像对应的三个定位点坐标。

import cv2
import numpy as nplena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]w,h = lena.shape[:2]
src = np.float32([[0,0],[w-1,0],[w-1,h-1]])
dst = np.float32([[30,0],[w+29,0],[w-1,h-1]])
M = cv2.getAffineTransform(src=src,dst=dst)
dsize = (w+50,h)
img = cv2.warpAffine(src=lena,M=M,dsize=dsize)cv2.imshow('lena',lena)
cv2.imshow('img',img)cv2.waitKey(0)
cv2.destroyAllWindows()

 3.4 透视

透视相比于倾斜,定义了四个基准点,可以进行非平行变换。

M = cv2.getPerspectiveTransform(src=*,dst=*)
img = cv2.warpPerspective(src=*,M=*,dsize=*,flags=*,borderMode=*,borderValue=*)

src:原始图像的四个定位点坐标。(可以是图像的任意四个角坐标)

dst:倾斜图像对应的四个定位点坐标。

cv2.warpPerspective:的参数基本与 cv2.warpAffine 相同,只不过这里的 M:4*2 变换矩阵

import cv2
import numpy as nplena = cv2.imread('Lena.png')
lena = lena[::2,::2,:]w,h = lena.shape[:2]
src = np.float32([[0,0],[w-1,0],[w-1,h-1],[0,h-1]])
dst = np.float32([[10,0],[w-11,0],[w-20,h-1],[20,h-1]])
M = cv2.getPerspectiveTransform(src=src,dst=dst)
img = cv2.warpPerspective(src=lena,M=M,dsize=lena.shape[:2])cv2.imshow('lena',lena)
cv2.imshow('img',img)cv2.waitKey(0)
cv2.destroyAllWindows()

四、重映射 cv2.remap()

按照自定义方法执行映射,可以实现图像的翻转、扭曲、变形、或特定区域图片内容的改变。 

img = cv2.remap(src=*,map1=*,map2=*,interpolation=*,borderMode=*,borderValue=*)

img:目标图像。

src:原始图像。

map1、map2:用于存放 src 原始图像的 X 坐标、Y 坐标。

interpolation:标注插值方式,默认为:INRTER_LINEAR。

borderMode:边界像素,默认为:BORDER_CONSTANT。

borderValue:边界填充值,默认为0。

import cv2
import numpy as nplena = cv2.imread('Lena.png')[::2,::2,:]w,h = lena.shape[:2]
mapx = np.zeros(lena.shape[:2],np.float32)
mapy = np.zeros(lena.shape[:2],np.float32)# 复制
for r in range(h):for c in range(w):mapx[r,c] = cmapy[r,c] = r
img1 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)# 垂直翻转
for r in range(h):for c in range(w):mapx[r,c] = cmapy[r,c] = h-1-r
img2 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)# 水平翻转
for r in range(h):for c in range(w):mapx[r,c] = w-1-cmapy[r,c] = r
img3 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)# 垂直和水平翻转
for r in range(h):for c in range(w):mapx[r,c] = w-1-cmapy[r,c] = h-1-r
img4 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

import cv2
import numpy as nplena = cv2.imread('Lena.png')[::2,::2,:]w,h = lena.shape[:2]
mapx = np.zeros(lena.shape[:2],np.float32)
mapy = np.zeros(lena.shape[:2],np.float32)# 缩小
for r in range(h):for c in range(w):mapx[r,c] = 2*cmapy[r,c] = 2*r
img1 = cv2.remap(src=lena,map1=mapx,map2=mapy,interpolation=cv2.INTER_LINEAR)[:int(w/2),:int(h/2),:]cv2.imshow('lena',lena)
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

理解(mapx,mapy)这两个二维矩阵重叠所构成的坐标 (width,height),对掌握 cv2.remap() 函数非常重要。

相关文章:

OpenCV-Python实战(8)——图像变换

一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…...

存储进阶笔记(二):Linux 存储栈:从 Device Mapper、LVM 到文件系统(2024)

记录一些平时接触到的存储知识。由于是笔记而非教程,因此内容不求连贯,有基础的同学可作查漏补缺之用。 存储进阶笔记(一):硬件基础:HDD/SDD、JBOD、RAID 等(2024) 存储进阶笔记&am…...

Linux(Centos 7.6)基础命令/常用命令说明

1.目录相关命令 命令命令说明pwd用于显示/打印当前目录位置。ls/ll 列出当前目录下的文件或者目录,ll是ls -l的别名,ls仅显示名称,ll会显示详细的目录文件信息。 cd目录切换,常见用法有,cd /切换到根目录,…...

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么?2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID(用于位置环)(1)公式(2)代码使用代码 2. 增量式…...

【Goland】怎么执行 go mod download

1、终端的执行 go mod tidy 2、终端执行不行的话,就可以通过右击go.mod文件来执行; 3、也可以按住Ctrl点击这个包安装;...

服务器主机测试网络

测试命令 speedtest-cli sudo yum install python-pip pip install speedtest-cli # 默认连接国外被拒绝,用阿里云 pip install -i https://mirrors.aliyun.com/pypi/web/simple --trusted-host mirrors.aliyun.com speedtest-cli Collecting speedtest-cliDownlo…...

【JMeter详解】

JMeter详解 Apache JMeter 是一个开源的、100%纯Java应用程序,设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源(如静态文件、Servlets、Perl脚本、Java对象、数据…...

Maven Wrapper 报错“未找到有效的 Maven 安装”

1. 检查 Maven Wrapper 配置: 确保你的项目中包含 .mvn/wrapper/maven-wrapper.properties 文件。 检查该文件中的 distributionUrl 属性,确保它指向一个有效的 Maven 发行版 URL。 2.确认 Maven Wrapper 脚本存在: 在项目根目录下&#x…...

如何通过 360 驱动大师检查自己电脑上的显卡信息

在深入探讨如何查看显卡信息之前,首先需要了解显卡的基本概念。显卡(Graphics Processing Unit, GPU),是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能,显卡通常被分为两类: 集成显卡&…...

C++并发:线程管控

1 线程基本管控 每个C程序都含有至少一个线程,即运行main()的线程,它由C运行时系统启动。随后程序可以发起更多线程,它们以别的函数作为入口。这些新线程连同起始线程并发运行。当main()返回时,程序就会退出;同样&…...

C++ 设计模式:策略模式(Strategy Pattern)

链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 观察者模式 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以…...

SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法

SpringBoot的版本控制是怎么做的 starter版本控制 SpringBoot的核心父依赖,下面导入的所有starter依赖都不需要指定版本,版本默认和spring-boot-starter-parent的parent版本一致; xxxstarter内部jar包依赖的版本管理,starter自…...

爬虫的工作原理

摘要: 本文详细阐述了爬虫的工作原理,从其基本概念出发,深入探讨了爬虫的主要组成部分,包括URL管理器、网页下载器、网页解析器和数据存储模块等。同时,分析了爬虫的抓取策略,如深度优先、广度优先等&#…...

你了解DNS吗?

你了解DNS吗? 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 介绍 …...

利用JavaScript实现顺序九宫格抽奖

顺序九宫格思路: 1.先获取抽奖按钮,方便给按钮绑定点击事件2.初始化下标k0,用于表示当前选中的索引下标,后续滚动起来会一直刷新3.获取大div盒子4.获取盒子里所有div元素,充当一个数组,后续可以通过下标来访问每个小div&#xff0…...

音视频入门知识(四):封装篇

⭐四、封装篇 H264封装成mp4、flv等格式,那为什么需要封装? ​ h264也能播放,但是按照帧率进行播放,可能不准 ★FLV **FLV(Flash Video)**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒…...

在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?

堆(Heap)和栈(Stack)的概念和区别 在基于 IMX6ULL 的 Linux 嵌入式编程中,堆(Heap)和栈(Stack)是两种不同的内存分配方式,各自具有不同的特点和用途。以下是它们的主要区别: 1. 存储位置 堆&am…...

Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

随着技术的成熟和 AI 的崛起,很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成。于是乎,单个开发者的能力得到了极大的提升 - 借助各种工具,一个人就可以完成开发、测试、运维等整条链路上的工作,渡劫飞…...

pthread.h互斥锁与原子操作

一:互斥锁 pthread.h 是 POSIX 线程库的头文件,它提供了多线程编程所需的各种功能。其中,互斥锁(mutex)的实现涉及多个底层机制: 1. 互斥锁的基本结构 在 POSIX 线程库中,互斥锁通常包含以下…...

网络基础入门到深入(3):网络协议-HTTP/S

目录 一、HTTP和HTTPS协议简介 1.HTTP协议 .HTTP 协议 作用: 特点: 2.HTTPS协议 作用: 实现方式: 特点: 二.HTTP的请求与响应结构 1.HTTP请求结构 1.请求行:描述操作和资源 2.请求头: 3.请求体 : 2.HTTP…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

【生成模型】视频生成论文调研

工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...