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.rhkb.cn/news/103589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化编排工具Terraform介绍(一)

Terraform是什么?: Terraform 是 HashiCorp 公司旗下的 Provision Infrastructure 产品, 是 AWS APN Technology Partner 与 AWS DevOps Competency Partner。Terraform 是一个 IT 基础架构自动化编排工具,它的口号是“Write, Plan, and Create …

优化时间流:区间调度问题的探索与解决

在浩如烟海的信息时代,时间的有效管理成为了一门不可或缺的艺术。无论是生活中的琐事,还是工作中的任务,时间都在无声地流逝,挑战着我们的智慧。正如时间在日常生活中具有的宝贵价值一样,在计算机科学领域,…

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之后会出现连接被拒绝,不用担…

USB Type-C端口集成式ESD静电保护方案 安全低成本

Type-C端口是根据USB3.x和USB4协议传输数据的,很容易受到电气过载(EOS)和静电放电(ESD)事件的影响。由于Type-C支持随意热插拔功能,其内部高集成度的芯片,更容易受到人体静电放电的伤害和损坏。…

Golang使用消息队列(RabbitMQ)

最近在使用Golang做了一个网盘项目(类似百度网盘),这个网盘项目有一个功能描述如下:用户会删除一个文件到垃圾回收站,回收站的文件有一个时间期限,比如24h,24h后数据库中记录和oss中文件会被删除…

使用端口映射实现Spring Boot服务端接口的公网远程调试:详细配置与步骤解析

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

使用 Feature Flags 与可观测工具实现数据库灰度迁移

场景描述 很多企业会遇到数据库升级、或数据库迁移的情况,尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而,我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕机等情况,最常见的移…

【Spring】一次性打包学透 Spring | 阿Q送书第五期

文章目录 如何竭尽可能确保大家学透Spring1. 内容全面且细致2. 主题实用且本土化3. 案例系统且完善4. 知识有趣且深刻 关于作者丁雪丰业内专家推图书热卖留言提前获赠书 不知从何时开始,Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中,很…

BTP Integration Suite学习笔记 - (Unit4) Developing with SAP Integration Suite

详细指导还是要看官方文档 4. 云集成管理 4.1 云集成介绍 什么是云集成? 前三章讲了很多内容,但都不是最核心的,通常我们用CPI是让他实现原来PI/PO的功能的,是用来做集成的。这章才刚开始。 云集成有以下几个特性:…

Django进阶:DRF(Django REST framework)

什么是DRF? DRF即Django REST framework的缩写,官网上说:Django REST framework是一个强大而灵活的工具包,用于构建Web API。 简单来说:通过DRF创建API后,就可以通过HTTP请求来获取、创建、更新或删除数据(…

【SVN内网穿透】远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

SpringBoot整合阿里云OSS,实现图片上传

在项目中&#xff0c;将图片等文件资源上传到阿里云的OSS&#xff0c;减少服务器压力。 项目中导入阿里云的SDK <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>…

在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

开源的密码学工具库:openssl安装在docker容器环境Linux(ubuntu18.04)

OpenSSL&#xff08;Open Secure Socket Layer&#xff09;是一个开源的密码学工具库&#xff0c;它提供了一系列的加密、解密、认证和通信安全相关的功能。OpenSSL 最初是为了支持安全的网络通信而设计的&#xff0c;但后来它的功能逐渐扩展到了许多不同的领域&#xff0c;包括…

多核异构核间通信Mailbox vs rpmsg

目录 一、关键术语解释 二、Mailbox与rpmsg对比 三、rpmsg传输流程 异构核间数据通过共享内存实现数据传递&#xff0c;通过中断来触发发送、接收。 一、关键术语解释 IPC Inter-Processor Communication MailBox IP which provides queued interrupt mechanism for comm…

javaWeb第一课

前言&#xff1a; 先来说说本来写完了的聊天室的项目&#xff0c;然后后面凡尔赛不小心改错了的然后一个上午才发现的问题&#xff0c;真的很有必要总结一下&#xff0c;气死我了&#xff1a;关于要将这个ArrayList的某个类型要转换为数组&#xff0c;我刚开始这么写的&#x…

leetcode 118.杨辉三角

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/pascals-triangle/description/ 代码&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {// 先开空间vector<vector<int>> v;v.…

【数据结构】C语言实现栈(详细解读)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现栈 目录 什么是栈 栈的概念及结构 实现栈的方式 链表的优缺点: 顺序表的优缺点: 栈…

AI创作助手:介绍 TensorFlow 的基本概念和使用场景

目录 背景 环境测试 入门示例 背景 TensorFlow 是一个强大的开源框架&#xff0c;用于实现深度学习和人工智能模型。它最初由 Google 开发&#xff0c;现在已经成为广泛使用的机器学习框架之一。 TensorFlow 简单来说就是一个用于创建和运行机器学习模型的库。它的核心概念…

2023年骨传导耳机推荐,一文读懂骨传导运动耳机哪个牌子好!

这几年&#xff0c;耳机圈开始流行起骨传导耳机&#xff0c;这种耳机通过贴合耳道附近的颌骨通过振动传递声音到听觉神经&#xff0c;相比较入耳式耳机来说&#xff0c;更有利于耳道卫生&#xff0c;而且在听歌同时可保持对环境声的感知&#xff0c;深受不少运动达人的喜爱。我…