OpenCV-Python实战(8)——图像变换
一、缩放 cv2.resize()
img = cv2.resize(src=*,dsize=*,fx=*,fy=*,interpolation=*)
img:目标图像。
src:原始图像。
dsize:(width,height)图像大小。
fx、fy:可选参数,水平/垂直方向缩放比例。
interpolation:可选参数,进行缩放操作使用哪种方法对图像进行删减或增补,常用方法如下:
| 方法 | 值 | 解释 |
| INTER_NEAREST | 0 | 最近插值法 |
| INTER_LINEAR | 1 | 双线性插值法 |
| INTER_CUBIC | 2 | 双三次插值法 |
| INTER_AREA | 3 | |
| INTER_LENCZOS4 | 4 | Lencz的插值方法 |
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()

三、仿射
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 平移
表示图像向X轴方向平移 ,向Y轴方向平移
。
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࿰…...
音视频入门知识(四):封装篇
⭐四、封装篇 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…...
深入解析Paddle GPU版本Segmentation fault报错及环境变量配置方案
1. 为什么Paddle GPU版本会突然报Segmentation fault? 最近在Linux系统上部署PaddlePaddle GPU版本时,不少开发者都遇到了一个让人头疼的问题——程序运行到一半突然崩溃,终端只留下一行冷冰冰的"Segmentation fault (core dumped)"…...
学术党福音:OpenClaw+Qwen3-32B自动生成LaTeX论文图表
学术党福音:OpenClawQwen3-32B自动生成LaTeX论文图表 1. 为什么需要自动化论文图表生成 作为长期与LaTeX搏斗的科研狗,我经历过无数次这样的深夜:在Python里调完matplotlib参数,手动导出PNG,再在LaTeX里反复调整\inc…...
Linux进程(下)
上一篇文章介绍了进程的概念和进程的状态,但进程的知识还有很多,本文继续进行讲解。进程的管理指令之前提到过许多对进程进行管理的指令,但没有进行讲解,在这里统一聊聊。核心指令有四个 ps,top,kill&#…...
tmux和screen对比
tmux和screen都是优秀的终端复用器,核心功能相似:在单个终端窗口中创建多个持久化的虚拟终端会话,实现会话保持、窗口分割和多任务管理。 核心对比概括: tmux:设计更现代,功能更强大灵活,配置…...
嵌入式OTA升级技术详解与实现方案
1. 嵌入式OTA升级技术概述OTA(Over-the-Air Technology)技术在现代嵌入式系统中扮演着至关重要的角色。作为一名嵌入式开发工程师,我在多个物联网项目中都深度参与了OTA功能的实现与优化。简单来说,OTA升级就是通过无线通信方式&a…...
CCLE数据库实战指南:从数据下载到肝癌细胞系分析
1. CCLE数据库入门指南 第一次接触CCLE数据库时,我和大多数新手一样感到无从下手。这个由Broad研究所维护的癌症细胞系百科全书,包含了超过1000种人类癌症细胞系的基因组、转录组和药理学数据。对于肝癌研究者来说,它就像一座待挖掘的金矿。 …...
视觉化看板工具怎么选?9 款创意团队项目协作平台优势分析
本文将深入对比 9 款支持视觉化看板的项目协作工具:Worktile、Trello、Asana、monday.com、ClickUp、Wrike、Notion、Jira、Teambition,重点分析它们在创意团队中的项目管理能力、适用场景、部署方式、协作效率与安全合规差异,帮助企业选型者…...
基于stm32的红外体温计设计[单片机]-计算机毕业设计源码+LW文档
摘要:本文详细阐述了一款基于STM32单片机的红外体温计设计过程。该设计综合运用红外测温技术、单片机控制技术以及OLED显示技术等,实现了对人体体温的快速、精准测量与直观显示。通过硬件电路设计与软件程序编写,完成了包括红外测温模块、单片…...
3DMax烘焙贴图实战:从零到一整合建筑模型,优化Unity运行性能
1. 为什么需要烘焙贴图:从性能瓶颈到解决方案 第一次把复杂建筑模型导入Unity时,我盯着屏幕上龟速移动的视角和疯狂跳动的帧率数字,整个人都是懵的。检查资源管理器才发现,这个看似普通的五层楼模型竟然用了87张不同尺寸的贴图&am…...
开源歌词工具技术解析:跨平台音乐资源整合与高效处理方案
开源歌词工具技术解析:跨平台音乐资源整合与高效处理方案 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 开源歌词工具作为一款专注于音乐资源处理的解决方案…...
