OpenCV基础知识(5)— 几何变换

前言:Hello大家好,我是小哥谈。OpenCV中的几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、旋转和透视效果。这些几何变换操作都涉及复杂、精密的计算。OpenCV将这些计算过程都封装成了非常灵活的方法,开发者只需要修改一些参数,就可以看到图像的变换效果。本节课就介绍几种常见的几何变换效果及其实现方法。🌈

前期回顾:

           史上最全OpenCV常用方法及使用说明汇总,建议收藏!

           OpenCV基础知识(1)— OpenCV概述

           OpenCV基础知识(2)— 图像处理的基本操作

           OpenCV基础知识(3)— 图像数字化基础(像素、色彩空间)

           OpenCV基础知识(4)— 绘制图形      

           目录

🚀1.缩放

💥💥1.1 dsize参数实现缩放

💥💥1.2 fx参数和fy参数实现缩放

🚀2.翻转

🚀3.旋转

🚀4.透视

🚀1.缩放

”表示缩小,“”表示放大,通过OpenCV中提供的resize()方法就可以随意更改图像的大小比例,其语法格式如下:

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

参数说明:

src:原始图像

dsize:输出图像的大小,格式为(宽,高),单位为像素。

fx:可选参数。水平方向的缩放比例。

fy:可选参数。垂直方向的缩放比例。

interpolation:可选参数。缩放的插值方式,在图像缩小或者放大时需要删减或补充像素,该参数可以指定使用哪种算法对像素进行增减。建议使用默认值。

返回值说明:

dst:缩放之后的图像

🍀resize()方法有两种使用方式,一种是通过dsize参数实现缩放,另一种是通过 fx fy 参数实现缩放,下面分别进行介绍。

💥💥1.1 dsize参数实现缩放

dsize参数的格式是一个元组,例如(100,200),表示将图像按照宽100像素、高200像素的大小进行缩放。如果使用dsize参数,则可以不写 fx fy 参数。

代码如下:

import cv2
img = cv2.imread("1.jpg")  # 读取图像
dst1 = cv2.resize(img, (300, 300))  # 按照宽300像素、高300像素的大小进行缩放
cv2.imshow("img", img)  # 显示原图
cv2.imshow("dst1", dst1)  # 显示缩放图像
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()   # 释放所有窗体

原始图像:

缩放后图像:

💥💥1.2 fx参数和fy参数实现缩放

使用 fx 参数和 fy 参数控制缩放的时候,dsize参数值必须使用None,否则 fx fy 就会失效。

fx 参数和 fy 参数可以使用浮点值,小于1的值表示缩小,大于1的值表示放大。

代码如下:

import cv2
img = cv2.imread("1.jpg")  # 读取图像
dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2)  # 将宽缩小到原来的1/3、高缩小到原来的1/2
cv2.imshow("img", img)  # 显示原图
cv2.imshow("dst3", dst3)  # 显示缩放图像
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

 原始图像:

 缩放后图像:


🚀2.翻转

水平线被称为X轴,垂直线被称为Y轴。图像沿着X轴或者Y轴翻转之后,可以呈现出镜面倒影的效果。OpenCV通过cv2.flip()方法实现翻转效果,其语法如下:

dst = cv2.flip(src,flipCode)

参数说明:

src:原始图像

flipCode:翻转类型,类型值如下表所示。

参数值含义
0沿着X轴翻转
正数沿着Y轴翻转
负数同时沿着X轴、Y轴翻转

返回值说明:

dst:翻转之后的图像

代码如下:

import cv2
img = cv2.imread("1.jpg")  # 读取图像
dst1 = cv2.flip(img, 0)  # 沿X轴翻转
dst2 = cv2.flip(img, 1)  # 沿Y轴翻转
dst3 = cv2.flip(img, -1)  # 同时沿X轴、Y轴翻转
cv2.imshow("img", img)  # 显示原图
cv2.imshow("dst1", dst1)  # 显示翻转之后的图像
cv2.imshow("dst2", dst2)
cv2.imshow("dst3", dst3)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

效果如图所示:


🚀3.旋转

让图像旋转也是通过M矩阵实现的,但得出这个矩阵需要做很复杂的运算,于是OpenCV提供了getRotationMatrix2D()方法来自动计算出旋转图像的M矩阵。其语法格式如下所示:

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

参数说明:

center:旋转的中心点坐标

angle:旋转的角度(不是弧度)。正数表示逆时针旋转,负数表示顺时针旋转。

scale:缩放比例,浮点类型。如果取值为1,表示图像保持原来的比例。

返回值说明:

M:方法计算出的仿射矩阵

🍀比如让图像逆时针旋转30°的同时缩小到原来的80%,代码如下:

import cv2
img = cv2.imread("1.jpg")  # 读取图像
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
center = (rows / 2, cols / 2)  # 图像的中心点
M = cv2.getRotationMatrix2D(center, 30, 0.8)  # 以图像为中心,逆时针旋转30度,缩放0.8倍
dst = cv2.warpAffine(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow("img", img)  # 显示原图
cv2.imshow("dst", dst)  # 显示仿射变换效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

 效果如图所示:


🚀4.透视

如果说仿射是让图像在二维平面中变形,那么透视就是让图像在三维空间中变形。从不同的角度观察物体,会看到不同的变形画面。例如,矩阵会变成不规则的四边形、直角会变成锐角或钝角、圆形会变成椭圆等,这种变形之后的画面就是透视图。🌴

OpenCV通过warpPerspective()方法来实现透视效果,其语法如下:

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

参数说明:

src:原始图像

M:一个3行3列的矩阵,根据此矩阵中的值变换原图中的像素位置。

dsize:输出图像的尺寸大小

flags:可选参数,插值方式,建议使用默认值。

borderMode:可选参数,边界类型,建议使用默认值。

borderValue:可选参数,边界值,默认为0,建议使用默认值。

返回值说明:

dst:经过透视变换后输出图像

warpPerspective()方法也需要通过M矩阵来计算透视效果,但得出这个矩阵需要做很复杂的运算,于是OpenCV提供了getPerspectiveTransform()方法来自动计算M矩阵。getPerspectiveTransform()方法的语法格式如下所示:

M = cv2.getPerspectiveTransform(src,dst)

参数说明:

src:原图四个点坐标,格式为4行2列的32位浮点数列表,例如:[[0,0],[1,0],[0,1],[1,1]]。

dst:透视图的四个点坐标,格式与src一样。

返回值说明:

M:方法计算出的仿射矩阵

🍀模拟从底部观察图像得到的透视效果,将图像顶部边缘收窄,底部边缘保持不变,代码如下:

import cv2
import numpy as np
img = cv2.imread("1.jpg")  # 读取图像
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
p1 = np.zeros((4, 2), np.float32)  # 32位浮点型空列表,保存原图四个点
p1[0] = [0, 0]  # 左上角点坐标
p1[1] = [cols - 1, 0]  # 右上角点坐标
p1[2] = [0, rows - 1]  # 左下角点坐标
p1[3] = [cols - 1, rows - 1]  # 右下角点坐标
p2 = np.zeros((4, 2), np.float32)  # 32位浮点型空列表,保存透视图四个点
p2[0] = [90, 0]  # 左上角点坐标,向右移动90像素
p2[1] = [cols - 90, 0]  # 右上角点坐标,向左移动90像素
p2[2] = [0, rows - 1]  # 左下角点坐标,位置不变
p2[3] = [cols - 1, rows - 1]  # 右下角点坐标,位置不变
M = cv2.getPerspectiveTransform(p1, p2)  # 根据四个点的变化轨迹计算出M矩阵
dst = cv2.warpPerspective(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow('img', img)  # 显示原图
cv2.imshow('dst', dst)  # 显示仿射变换效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

 效果如图所示:


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux开发实操(十一):ETH网络接口开发

# 前言 嵌入式linux也有些是支持网口的,比如RGMII,嵌入式系统资源支持以太网和其他基本接口的硬件平台(板上或片上系统),有充足的NOR或NAND Flash闪存,用于容纳OS、lib库、fileSystem文件系统、APP应用程序、Bootloader引导程序等。嵌入式Linux是开源的、可修改的,并且…

go语言中channel类型

目录 一、什么是channel 二、为什么要有channel 三、channel操作使用 初始化 操作 单向channel 双向channel,可读可写 四、close下什么场景会出现panic 五、总结 一、什么是channel Channels are a typed conduit through which you can send and receive …

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现DBN-ELM深度置信网络结合极限学习…

Redis 分布式锁存在什么问题 ?如何解决 ?

目录 1. 如何实现分布式锁 2. Redis 分布式锁存在什么问题 2.1 解决死锁问题 2.2 解决锁误删问题 1. 如何实现分布式锁 Redis 天生就可以作为一个分布式系统来使用,所以它实现的锁都是分布式锁。 Redis 可以通过 setnx(set if not exists&#xff09…

c语言实现队列

文章目录 前言一、队列的特征二、队列的实现1、队列的设计2、队列的初始化3、元素的入队和出队4、返回队头的数据和队尾的数据5、返回队列的长度6、队列的销毁 三、循环队列四、队列和栈综合练习 前言 栈的特点是元素后进先出(Last In First Out),而对应的还有一种…

Android GreenDao数据库升级(附Demo)

前言 大家好久不见,一转眼马上八月份下旬了,最近由于工作比较忙,没时间给大家更新博文。百忙之中抽出时间,给大家来更新一篇关于GreenDao3数据库的升级。 关于GreenDao的详细介绍以及一些逻辑性的增、删、改、查等,可以…

3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)

1.Ubuntu Qt 配置交叉编译环境 1.1 ubuntu 20.04安装Qt sudo apt-get install qtcreator 1.2 配置QT GCC配置同上 最后配置Kits 上面设置完成之后 ,设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上) 点击NEXT之后会出现连接被拒绝,不用担…

ARM-汇编指令

一,map.lds文件 链接脚本文件 作用:给编译器进行使用,告诉编译器各个段,如何进行分布 /*输出格式:32位可执行程序,小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

React原理 - React Virtual DOM 原理

目录 扩展学习资料 Virtual DOM 是什么【虚拟dom】 React渲染 Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】 Virtual DOM数据结构 Virtaual DOM Diff【虚拟dom前后比对,更新不同dom的算法】 源码解读 react源码组织方式: React Stack Rec…

YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析

前言:Hello大家好,我是小哥谈。NMS是指非极大值抑制(non maximum suppression),它是一种常用于物体检测任务的算法。在物体检测中,通常会有多个预测框(bounding box)被提议出来&…

开始MySQL探索——数据库概述

计算机语言 计算机语言概述 计算机语言(Computer Language)可以简单的理解为一种计算机和人都能识别的语言。 机器语言 汇编语言 高级语言 机器语言 汇编语言 高级语言 SQL语言基础 SQL的概述 SQL全称:Structured Query Language&…

Aspose.Tasks for .NET V23Crack

Aspose.Tasks for .NET V23Crack 改进了大型项目的内存占用。 添加了API,允许您在应用程序无法访问系统字体文件夹时指定用户的字体文件夹。 Aspose.Tasksfor.NET是处理MicrosoftProject文件的可靠的项目管理API。API支持在不依赖Microsoft Project的情况下读取、写…

平安私人银行慈善沙龙广州站:善财传承公益有道,广州分行聚爱同行

近年来,平安私人银行将慈善作为客户服务的王牌权益之一,激发和满足客户公益慈善心愿,打造财富人群和困境人群的桥梁,并链接公益机构等专业组织,深度挖掘金融赋能慈善的多种可能性,让财富通过慈善事业释放出…

在router中使用pinia、在组件外使用pinia时 报错没有激活pinia

getActivePinia was called with no active Pinia. Did you forget to install pinia? 我想在路由守卫中使用store中部的数据,但是拿不到仓库,提示pinia没激活 解决方案:借鉴vben-admin 在每个模块中都把pinia和当前的仓库绑定一份暴漏出去…

ARM--day5(C语言点灯实验、总线、串口通信信息、串口通讯协议)

函数分装实现点灯 gpio.c: #include "gpio.h" //函数功能:GPIO引脚初始化操作 //参数1:GPIO组号 //参数2:引脚编号 //参数3:初始化内容 void hal_gpio_init(volatile gpio_t*gpiox,unsigned int pin,gpio_init_t* ini…

net start Mysql 启动服务时 ,显示“Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误

一、问题 有时候,输入net start Mysql 启动服务时 mysql>net start Mysql 显示 Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误 二、原因 由于mysql的默认端口是3306,因此在启动服务的时候,如果此端口被占用,就会出…

VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库

前面说的Delphi通过Activex DLL同时调用PowerBasic和FreeBasic写的DLL,是在WINDOWS基础平台上完成的。 而 .NET平台是架在WINDOWS基础平台之上的,它的上面VB.NET或C#等开发的APP程序,下面写一下用VB.NET,通过VB6注册的Activex DLL…

Ubuntu20.04安装软件报错:The following packages have unmet dependencies

Ubuntu20.04更换阿里云源后安装软件都会报错:The following packages have unmet dependencies 查看资料,大概是ubuntu本身的源比较版本较老,而阿里云的源比较新,因此版本不匹配造成依赖的库不匹配,所以只要将阿里云的…

vue 简单实验 数据更新

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"counter">Counter: {{ counter }} </div> <script> const Counter {data() {return {counter: 5}},mounted() {set…

基于Jenkins CICD的代码发布与回滚-------从小白到大神之路之学习运维第87天

第四阶段提升 时 间&#xff1a;2023年8月24日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; 基于Jenkins CICD的代码发布与回滚 目录 一、案例概述 二、案例知识点 三、案例环境 &#xff08;一&#xff0…