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

opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)

什么是几何变换?

几何变换是计算机图形学中的一种图像处理技术,用于对图像进行空间上的变换,而不改变图像的内容。这些变换可以通过对图像中的像素位置进行调整来实现。

常见的几何变换包括:

平移(Translation):将图像在水平和/或垂直方向上进行平移,即将图像的每个像素沿着指定的距离进行移动。

缩放(Scaling):通过增大或减小图像的尺寸,使图像变得更大或更小。在缩放过程中,图像中的每个像素的位置会相应地调整。

旋转(Rotation):将图像绕着一个特定的旋转中心进行旋转,使得图像的内容按照指定的角度进行旋转。

翻转(Flip):将图像在水平和/或垂直方向上进行翻转,即将图像的像素按照指定的方向进行镜像反转。

剪切(Shearing):在某个方向上,将图像的一部分像素按照一定的比例进行平移,使得图像在该方向上发生错切效果。

几何变换的应用场景

几何变换在计算机图形学和计算机视觉领域有广泛的应用场景。以下是一些常见的几何变换的应用场景:

图像配准(Image Registration):在医学影像、遥感图像等领域,需要将多幅图像进行对齐,使得它们在空间上对应的位置一致。几何变换可以用于实现图像的平移、旋转和缩放,从而实现图像的配准。

图像增强(Image Enhancement):在图像增强中,几何变换可以用于调整图像的尺寸和位置,使得图像在显示或处理时更合适。比如将图像缩放到指定大小,或者对图像进行裁剪。

视觉效果和动画:在计算机游戏、动画制作等领域,几何变换可以用于实现图像或物体的平移、旋转和缩放,从而创建出各种视觉效果和动画。

图像变形(Image Warping):图像变形是指将图像的某些区域按照一定的规则进行变形,从而实现特定的效果,如人脸变形、风格化效果等。

2D到3D的转换:在计算机辅助设计(CAD)和虚拟现实(VR)中,几何变换可以用于将2D图像转换成3D模型或场景。

视角变换(Viewpoint Transformation):在计算机视觉中,几何变换可以用于将图像从不同视角进行观察,从而对图像进行重建、分析或识别。

图像拼接(Image Stitching):将多幅图像拼接成一幅全景图时,需要进行图像的平移、旋转和缩放等几何变换,以使得不同图像之间能够无缝地对齐。

总的来说,几何变换在图像处理和计算机图形学中起着至关重要的作用,它们能够改变图像的位置和形状,从而实现图像的对齐、增强、变形和合成等多种功能。

以下对几个常用的图像变换操作进行单独分析

缩放

在 OpenCV 中,使用函数 cv2.resize()实现对图像的缩放,该函数的具体形式为:

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

式中:
 dst 代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时),
或者可以通过 src.size()、fx、fy 计算得到。
 src 代表需要缩放的原始图像。
 dsize 代表输出图像大小。
 fx 代表水平方向的缩放比例。
 fy 代表垂直方向的缩放比例。
 interpolation 代表插值方式,具体如表 5-1 所示。

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

在 cv2.resize()函数中,目标图像的大小可以通过“参数 dsize”或者“参数 fx 和 fy”二者之一来指定,具体介绍如下。

 情况 1:通过参数 dsize 指定
如果指定参数 dsize 的值,则无论是否指定了参数 fx 和 fy 的值,都由参数 dsize 来决定目
标图像的大小。
此时需要注意的是,dsize 内第 1 个参数对应缩放后图像的宽度(width,即列数 cols,与参数 fx 相关),第 2 个参数对应缩放后图像的高度(height,即行数 rows,与参数 fy 相关)。
指定参数 dsize 的值时,x 方向的缩放大小(参数 fx)为:

(double)dsize.width/src.cols

同时,y 方向的缩放大小(参数 fy)为:

(double)dsize.height/src.rows

情况 2:通过参数 fx 和 fy 指定

如果参数 dsize 的值是 None,那么目标图像的大小通过参数 fx 和 fy 来决定。此时,目标图像的大小为:

dsize=Size(round(fx*src.cols),round(fy*src.rows))

插值是指在对图像进行几何处理时,给无法直接通过映射得到值的像素点赋值。

例如,将图像放大为原来的 2 倍,必然会多出一些无法被直接映射值的像素点,对于这些像素点,插值方式决定了如何确定它们的值。

除此以外,还会存在一些非整数的映射值,例如,反向映射可能会把目标图像中的像素点值映射到原始图像中的非整数值对应的位置上,当然原始图像内是不可能存在这样的非整数位置的,即目标图像上的该像素点不能对应到原始图像的某个具体位置上,此时也要对这些像素点进行插值处理,以完成映射。

函数 cv2.resize()能实现对原始图像的缩放功能,需要注意的是,开始运算前,操作前的目标图像 dst 自身的大小、类型与最终得到的目标图像 dst 是没有任何关系的。
目标图像 dst 的最终大小和类型是通过 src、dsize、fx、fy 指定的。如果想让原始图像调整为和目标图像一样大,
则必须通过上述属性指定。

当缩小图像时,使用区域插值方式(INTER_AREA)能够得到最好的效果;
当放大图像时,使用三次样条插值(INTER_CUBIC)方式和双线性插值(INTER_LINEAR)方式都能够取得较好的效果。
三次样条插值方式速度较慢,双线性插值方式速度相对较快且效果并不逊色。

实验:使用函数 cv2.resize()对一个数组进行简单缩放

import cv2
import numpy as np
img=np.ones([2,4,3],dtype=np.uint8)
#获取图像的尺寸
size=img.shape[:2]
print("size=\n",size)
#缩放图像
rst=cv2.resize(img,size)print("img.shape=\n",img.shape)
print("img=\n",img)
print("rst.shape=\n",rst.shape)
print("rst=\n",rst)

在本例中,我们期望通过函数 cv2.resize()对原始图像进行缩放。为了方便观察,将目标图像设置为与原始图像等大小
运行结果:

size=(2, 4)
img.shape=(2, 4, 3)
img=[[[1 1 1][1 1 1][1 1 1][1 1 1]][[1 1 1][1 1 1][1 1 1][1 1 1]]]
rst.shape=(4, 2, 3)
rst=[[[1 1 1][1 1 1]][[1 1 1][1 1 1]][[1 1 1][1 1 1]][[1 1 1][1 1 1]]]

通过程序我们观察到,我们的目的没有达到,目标图像的大小与原始图像的大小并不一致。
原始图像的大小是 2 行 4 列,目标图像的大小是 4 行 2 列:

 目标图像的行数是原始图像的列数。
 目标图像的列数是原始图像的行数。

通过以上例题我们进一步确认:函数 cv2.resize()内 dsize 参数与图像 shape 属性在行、列的顺序上是不一致的,或者说,
 在 shape 属性中,第 1 个值对应的是行数,第 2 个值对应的是列数。
 在 dsize 参数中,第 1 个值对应的是列数,第 2 个值对应的是行数。
我们通常使用等大小的图像进行测试,在这种情况下,可能无法发现 cv2.resize()函数内 dsize 参数的具体使用方式。
在使用 cv2.resize()函数时,要额外注意参数 dsize 的属性顺序问题

实验2:使用函数 cv2.resize()完成一个简单的图像缩放

import cv2
img=cv2.imread("lena.png")
print(img.shape)
rows,cols=img.shape[:2]
#重置图像大小
size=(int(cols*0.9),int(rows*0.5))
rst=cv2.resize(img,size)
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)cv2.imshow("img",img)
cv2.imshow("rst",rst)cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

(512, 512, 3)
img.shape= (512, 512, 3)
rst.shape= (256, 460, 3)

在这里插入图片描述
从程序可以看出:
 列数变为原来的 0.9 倍
 行数变为原来的 0.5 倍

实验3:控制函数 cv2.resize()的 fx 参数、fy 参数,完成图像缩放

import cv2
img=cv2.imread("lena.png")
print(img.shape)
rows,cols=img.shape[:2]
#重置图像大小
size=(int(cols*0.9),int(rows*0.5))#rst=cv2.resize(img,size)rst=cv2.resize(img,None,fx=2,fy=0.5)print("img.shape=",img.shape)
print("rst.shape=",rst.shape)cv2.imshow("img",img)
cv2.imshow("rst",rst)cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

(512, 512, 3)
img.shape= (512, 512, 3)
rst.shape= (256, 1024, 3)

在这里插入图片描述

从程序可以看出:
 fx 进行的是水平方向的缩放,将列数变为原来的 2 倍,得到 512×2=1024。
 fy 进行的是垂直方向的缩放,将行数变为原来的 0.5 倍,得到 512×0.5=256。

相关文章:

opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)

什么是几何变换? 几何变换是计算机图形学中的一种图像处理技术,用于对图像进行空间上的变换,而不改变图像的内容。这些变换可以通过对图像中的像素位置进行调整来实现。 常见的几何变换包括: 平移(Translation&#x…...

python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归

线性回归所解决的问题是把数据集的特征传入到模型中,预测一个值使得误差最小,预测值无限接近于真实值。比如把房子的其他特征传入到模型中,预测出房价, 房价是一系列连续的数值,线性回归解决的是有监督的学习。有很多场…...

聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法

聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法 当使用LINQ查询数据时,我们常常会面临选择使用.AsEnumerable(), .AsQueryable(), 和 .ToList()方法的情况。这些方法在使用时有不同的效果和影响,需要根据具体场景来选择合适的方法。…...

【机器学习】机器学习中的“本体”概念

一、说明 在机器学习中,本体越来越多地用于提供基于相似性分析和场景知识的 ML 模型。 在传统的基于标签的定义中,对象往往是孤立的,可扩展性差,存在重复的可能性,对象之间的关系无法体现。在基于本体的定义中&#xf…...

ChatGPT是否能够进行对话中的参考和指代解析?

ChatGPT在对话中的参考和指代解析方面有一定的潜力,但需要针对具体任务和上下文进行定制和优化。参考和指代解析是指理解对话中的代词、名词短语等表达方式所指代的具体对象或信息。在对话中,参考和指代解析对于理解上下文、保持对话连贯性和生成准确回复…...

网红项目AutoGPT源码内幕及综合案例实战(三)

AutoGPT on LangChain PromptGenerator等源码解析 本节阅读AutoGPT 的prompt_generator.py源代码,其中定义了一个PromptGenerator类和一个get_prompt函数,用于生成一个提示词信息。PromptGenerator类提供了添加约束、命令、资源和性能评估等内容的方法,_generate_numbered_l…...

第八章:list类

系列文章目录 文章目录 系列文章目录前言list的介绍及使用list的介绍list的使用list的构造函数list的迭代器list的容量list的成员访问list的增删改查 list与vector的对比总结 前言 list是STL的一种链表类,可以在常数范围内在任意位置进行插入和删除的序列式容器。 …...

VUE声音-报警-实现方式

1.先准备一个mp3文件包&#xff1a;&#xff08;这个24小时生效如果失效可留言&#xff0c;看到就会增加时效&#xff09; 获取mp3地址&#xff1a; https://www.aliyundrive.com/t/uQ8zqjn9JKSfm7QlGOSr2.代码内容 进入页面就会自动 播放mp3的内容信息了。 <template>…...

【Coppeliasim C++】焊接机械臂仿真

项目思维导图 该项目一共三个demo&#xff1a; 机械臂末端走直线 2. 变位机转台转动 3.机械臂末端多点样条运动 笔记&#xff1a; 基于等级的蚁群系统在3D网格地图中搜索路径的方法: 基于等级的蚁群系统(Hierarchical Ant Colony System,HACS)是一种改进的蚁群优化算法。它在传…...

【LeetCode】94.二叉树的中序遍历

题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输…...

AWS IAM介绍

前言 AWS是世界上最大的云服务提供商&#xff0c;它提供了很多组件供消费者使用&#xff0c;其中进行访问控制的组件叫做IAM(Identity and Access Management)&#xff0c; 用来进行身份验证和对AWS资源的访问控制。 功能 IAM的功能总结来看&#xff0c;主要分两种&#xff1…...

MySQL碎片清理

为什么产生&#xff1f; 经过大量增删改的表&#xff0c;都可能存在碎片 MySQL数据结构是B树&#xff0c; 删除某一记录&#xff0c;只会标记为删除&#xff0c;后续插入一条该区间的记录&#xff0c;就会复用这个位置。 删除整个数据页的记录&#xff0c;则整个页标记为“可…...

elasticsearch操作(API方式)

说明&#xff1a;es操作索引库、文档&#xff0c;除了使用它们自带的命令外&#xff08;参考&#xff1a;http://t.csdn.cn/4zpmi&#xff09;&#xff0c;在IDEA中可以添加相关的依赖&#xff0c;使用对应的API来操作。 准备工作 搭建一个SpringBoot项目&#xff0c;DAO使用…...

Vue2.0 使用 echarts

目录 1. 配置 渲染2. 数据渲染 1. 配置 渲染 安装 echarts 依赖 npm install echarts -Smain.js&#xff0c;引入 echarts import * as echarts from echarts// 在import的后面&#xff0c;echarts的前面加一个 * as Vue.prototype.$echarts echarts从 echarts 官网直接复制…...

企业微信,阿里钉钉告警群机器人

链接&#xff1a;如何通过企业微信群接收报警通知_云监控-阿里云帮助中心...

linux下的tomcat

springboot项目端口是8080&#xff0c;部署到linux运行之后&#xff0c;为什么能检测到tomcat 手动安装tomcat&#xff0c;以下是在 Linux 系统上安装 Tomcat 的步骤&#xff1a; 下载 Tomcat 安装包。您可以从 Tomcat 官方网站&#xff08;https://tomcat.apache.org/ ↗&…...

Vue源码学习 - new Vue初始化都做了什么?

目录 前言一、创建一个 Vue 实例二、找到 Vue 构造函数三、源码分析 - Vue.prototype._init四、源码分析 - 调用 $mount 方法&#xff0c;进入挂载阶段五、总结 前言 使用Vue也有一段时间了&#xff0c;最近去阅读了Vue的源码&#xff0c;想总结分享下学到的新东西。 如果觉得…...

新零售数字化商业模式如何建立?新零售数字化营销怎么做?

随着零售行业增速放缓、用户消费结构升级&#xff0c;企业需要需求新的价值增长点进行转型升级&#xff0c;从而为消费者提供更为多元化的消费需求、提升自己的消费体验。在大数据、物联网、5G及区块链等技术兴起的背景下&#xff0c;数字化新零售系统应运而生。 开利网络认为&…...

C++语法(26)--- 特殊类设计

C语法&#xff08;25&#xff09;--- 异常与智能指针_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131537799?spm1001.2014.3001.5501 目录 1.特殊类设计 1.设计一个类&#xff0c;不能被拷贝 C98 C11 2.设计一个类&#xff0c;只能在堆上…...

YAML+PyYAML笔记 2 | YAML缩进、分离、注释简单使用

2 | YAML缩进、分离、注释简单使用 1 简介2 缩进3 分离4 多行文本4.1 折叠块4.2 字面块4.3 引用块 5 注释5.1 行内注释5.2 块注释5.3 完美注释示例 1 简介 YAML 不是一种标记语言&#xff0c;而是一种数据格式&#xff1b;使用缩进和分离来表示数据结构&#xff0c;不需要使用…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法

目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客&#xff1a;【写在创作纪念日】基于SpringBoot和PostG…...