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。

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

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

相关文章

MySQL-MHA高可用配置及故障切换

MySQL-MHA 一、MHA概述:1.概述:2.MHA的组成:3.MHA的特点:4.MHA的工作原理: 二、搭建MySQL MHA:1.配置主从复制:2.配置MHA:3.manager与node工具使用:4.在 manager 节点上配…

vue3+Luckysheet实现表格的在线预览编辑(electron可用)

前言: 整理中 官方资料: 1、github 项目地址https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/ 2、xlsx vue3 json数据导出excel_vue3导出excel_羊…

vue项目登录页面实现记住用户名和密码

vue项目登录页面实现记住用户名和密码 记录一下实现的逻辑,应该分两步来理解这个逻辑 首次登录,页面没有用户的登录信息,实现逻辑如下: 用户输入用户名和密码登录,用户信息为名为form的响应式对象,v-model…

【Linux下6818开发板(ARM)】硬件空间挂载

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

查看8080端口会不会被占用

相关命令 查看8080端口会不会被占用 netstat -ano | findstr 8080 查看 终止占用端口xxx的进程 taskkill /f /pid xxx 具体步骤 第一步:点击起始菜单(或是通过winR快捷键),在输入框中输入cmd,点击确定&#x…

MySQL 服务器的调优策略

点击上方↑“追梦 Java”关注,一起追梦! 在工作中,我们发现慢查询一般有2个途径,一个是被动的,一个是主动的。被动的是当业务人员反馈某个查询界面响应的时间特别长,你才去处理。主动的是通过通过分析慢查询…

Rabbitmq的安装与使用(Linux版)

目录 Rabbitmq安装 1.在Ubuntu上安装RabbitMQ: 打开终端,运行以下命令以更新软件包列表: 安装RabbitMQ: 安装完成后,RabbitMQ服务会自动启动。你可以使用以下命令来检查RabbitMQ服务状态: 2.在CentOS…

Java集合框架的全面分析和性能增强

Java集合框架的全面分析和性能增强 💗摘要:💗 1. Java集合框架概述💗1.1 Collection接口1.1.1 List接口1.1.2 Set接口1.1.3 Queue接口 💗1.2 Map接口 💗2. Java集合框架性能优化💗2.1 选择合适的…

idea项目依赖全部找不到

目录 1,出错现象2,解决3,其他尝试 1,出错现象 很久没打开的Java项目,打开之后大部分依赖都找不到,出现了所有的含有import语句的文件都会报错和一些注解报红报错,但pom文件中改依赖是确实被引入…

线性模型学习

代码实现 import numpy as np import matplotlib.pyplot as pltx_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0]def forward(x):return x * wdef loss(x, y):y_pred forward(x)return (y_pred - y) * (y_pred - y)w_list [] mse_list [] for w in np.arange(0.0, 4.1, 0.…

Jenkins插件管理切换国内源地址

一、替换国内插件下载地址 选择系统管理–>插件管理–> Available Plugins 并等待页面完全加载完成、这样做是为了把jenkins官方的插件列表下载到本地、接着修改地址文件、替换为国内插件地址 进入插件文件目录 cd /var/lib/jenkins/updatesdefault.json 为插件源地址…

mysql(五)主从配置

目录 前言 一、MySQL Replication概述 二、MySQL复制类型 三、部署MySQL主从异步复制 总结 前言 为了实现MySQL的读写分离,可以使用MySQL官方提供的工具和技术,如MySQL Replication(复制)、MySQL Group Replication(组…

最全面的msvcp110.dll丢失修复方法分享,快速修复msvcp110.dll文件

今天主要给大家详细的介绍一下msvcp110.dll丢失修复的方法,因为在网上看到很多人因为这个问题而烦恼,其实这个问题不难解决的,下面就给大家分享多种方法,一起来看看吧。 一. 修复msvcp110.dll丢失的方法 重新安装相关程序 首先&…

Python 字符串详解

整数: 浮点数,复数: #归根到底,字符串是一个序列,是像元组那样不可变的序列。 #所以我们可以用切片的方式,将字符串反转。#字符串的诸多方法 #调用字符串内部方法的好处:更快,更安…

用cahtGPT写高考作文,看一下会有如何表现

大家好,2023年高考结束有一段时间了,今天,我们尝试使用人工智能写作模型ChatGPT来写一篇高考作文,并猜测一下它的表现。 首先,我们需要简单介绍一下ChatGPT。它是由OpenAI开发的一种人工智能写作模型,可以…

实现二叉排序树

一:二叉树和二叉搜索树 二叉树中的节点最多只能有两个子节点:一个是左侧子节点,另一个是右侧子节点。这个定义有助于我们写出更高效地在树中插入、查找和删除节点的算法,二叉树在计算机科学中的应用非常广泛。 **二叉搜索树&…

Java Spring和Spring集成Mybatis

0目录 1.Spring 2.Spring集成Mybatis 1.Spring 特性 IOC:控制反转 AOP:面向切面 Spring组成部分 在SMM中起到的作用(粘合剂) Spring理念 OOP核心思想【万物皆对象】 Spring核心思想【万物皆Bean组件】 Spring优势 低侵入式 …

【决策树-鸢尾花分类】

决策树算法简介 决策树是一种基于树状结构的分类与回归算法。它通过对数据集进行递归分割,将样本划分为多个类别或者回归值。决策树算法的核心思想是通过构建树来对数据进行划分,从而实现对未知样本的预测。 决策树的构建过程 决策树的构建过程包括以…

vue计时器

//将秒转化为时分秒 const resultTime ref();const formateSeconds function (endTime) {let secondTime parseInt(endTime); //将传入的秒的值转化为Numberlet min 0; // 初始化分let h 0; // 初始化小时// let result "";if (secondTime > 60) {//如果秒数…

PLC绝对值指令ABS()

在C语言里,ABS()指令属于基础指令,博途PLC系统也有绝对值指令。对于S7-200SMART PLC则需要自行构造,下面给出SMART PLC的绝对值指令ABS()。 1、S7-SMART PLC绝对值指令 2、STL代码 SUBROUTINE_BLOCK ABS:SBR3 TITLE=ABS()函数 VAR_INPUT x:REAL; END_VAR VAR_OUTPUT y:RE…