opencv初步学习——图像处理3

        这一部分我们将学习opencv中对图像大小进行调整的基本操作,以及掩模操作,我们直接进入正言

一、cv2.resize( )函数

1-1、组成与构造

        该函数的作用就算用来帮助我们实现对图像大小的处理,具体的组成与构造如下:

cv2.resize(src , 大小设置 , interpolation)

        src即我们的原图像,我们的重点放在大小设置与interpolation上,我们的原图像如下:


1-2、大小设置 

        该函数的大小设置主要有两种方法,对应的参数分别是dsize与fx、fy,我们分别来说

        (1)直接设定大小(dsize)

                我们的代码形式如下:

import cv2
img = cv2.imread("D:\\photo\\man.png")dst = cv2.resize(img,[100,100])cv2.imshow("one",dst)
cv2.waitKey()
cv2.destroyAllWindows()

                这里我们就直接设定为100×100的大小了,通常叫做参数dsize,当然这里可以是元组的形式,也可以是列表的形式,输出的图像会被缩小到100×100的大小,这里就不放出结果图了

                当然我们还有其他写法,我们可以直接先设置好缩放大小,然后在放进我们的函数中去,这样我们就可以方便我们去修改我们的缩放比例:

rows,cols = img.shape[:2]
size=(int(cols*0.9) , int(rows*0.9))   这里必须要强制类型转化,想想是为什么呢
dst = cv2.resize(img , size)

                解释一下shape 是 NumPy 数组的一个属性,它会返回一个元组,这个元组包含了数组各维度的大小。对于单通道图像,img.shape 返回的元组格式为 (行数, 列数);对于多通道图像,返回的元组格式为 (行数, 列数, 通道数)

        (2)设定缩放大小(fx、fy)

                这个的区别在于我们需要手动设置一个缩放大小,而不是设置一个具体的缩小到怎么样的大小,具体我们的代码如下:

import cv2
img = cv2.imread("D:\\photo\\man.png")dst = cv2.resize(img, None, fx=0.5, fy=0.5)cv2.imshow("one",img)
cv2.imshow("two",dst)
cv2.waitKey()
cv2.destroyAllWindows()

                这里出现新的参数,即我们的fx与fy,分别表示我们在水平方向上的缩放因子与垂直方向上的缩放因子。按照上面代码的操作我们的图像将被缩小一半,这里也不做展示了

                疑惑:

                Q1、那么就会有人问,为什么前面加一个None呢

                ——这是告诉编译器我不用直接设置大小,而是设置缩放比例,是需要对dsize设定为None,而且这个函数对大小设置其实是有一定顺序的:

                

                Q2、那我可不可以不写fx=、fy=呢?

                ——当然可以,但是如果是这样写,是不对的:

dst = cv2.resize(img, None, 0.5,0.5)

                        你会发现编译器报错了,因为在dsize与我们fx、fy之间还有一个参数(见上图),即我们的dst,这个就是会为你自动创建一个数组出来存储这些信息,但我们在前面已经设置好了dst = ~~,故我们在这个参数也需要设置为None。

                        所以我们的正确写法如下:

dst = cv2.resize(img, None, None, 0.5,0.5)

                        


1-3、interpolation(插值方法)

        首先我们需要知道什么是插值方法,以及为什么我们需要插值

        我们在对图像进行放大和缩小的时候,我们的像素点数量也在发生变化,例如我们可以设定为100×100的像素大小,那么为了保证我们的图像在放大缩小后仍可以反映原来图像的主要信息,所以我们需要进行一系列操作来使我们的像素点的颜色变化,对新像素值进行估计,从而达到此目的,这种方法就是插值

        这就更照片像素越高反映出的画面越高清丝滑;像素越低越像在看马赛克差不多的意思

        我们只是简单来看看有哪些插值方法(不要求原理):

插值方法具体实现
cv2.INTER_NEAREST(最近邻插值)

该方法会选取距离目标像素最近的原始像素的值作为目标像素的值。例如,当图像放大时,新像素直接采用离它最近的原始像素的颜色。

特点:计算速度快图像质量相对较差,在放大图像时容易出现锯齿状边缘。

cv2.INTER_LINEAR(双线性插值)

它基于目标像素周围 2x2 邻域内的四个原始像素的值,通过线性加权计算来确定目标像素的值。这种方法考虑了周围像素的影响,使得图像过渡更加平滑

特点:计算速度适中,图像质量较好,是 cv2.resize() 函数的默认插值方法

cv2.INTER_CUBIC(双三次插值)

此方法基于目标像素周围 4x4 邻域内的 16 个原始像素的值,使用三次函数进行加权计算,从而得到目标像素的值。相比双线性插值,它能更精确地拟合图像的局部特征。

特点:计算量较大,速度较慢,但图像质量非常高,在放大图像时能保留更多的细节

cv2.INTER_AREA(区域插值

该方法基于图像区域的像素密度进行插值。在缩小图像时,它通过对原始图像的像素块进行平均来计算目标像素的值;在放大图像时,其效果类似于最近邻插值。

特点:在缩小图像时效果较好,能有效避免图像出现模糊和失真现象;但在放大图像时效果不佳。



二、掩模

ps:勉励大家一句话:书山有路勤为径,学海无涯苦作舟,因为编者也学得很累了,但怎么能够放弃呢。

        ok言归正传,首先我们需要知道什么是掩模,我们需要掩模来干什么

        在手术的时候,我们常常看见医生会铺一层防菌布(绿色那一个),然后在需要手术的部位开一个口子来进行手术,这样做可以不干扰到其他部位(比如突然喷了)。掩模也是这个道理,我们对需要处理的图像部分掩模,这样在后面的操作中就可以提醒程序这个地方要动,其他地方不要动

        举一个例子来说明:

图像选自《计算机视觉40例从入门到深度学习》(李立宗)

        中间即我们的掩模图像,右图是使用掩模图像对原始图像进行掩模运算的图像

        那么我们就要思考如何才能到达这种目的

1-1、乘法运算

        在图像处理中我们的乘法运算遵循如下原理:

        1、任意数字与 1 相乘,结果是数字 N 自身。

        2、 任意数字与 0 相乘,结果为 0

        那么我们可以构造出一个只含有0与1的掩模图像,随后将这个掩模图像与原始图像相乘,即得到我们的结果图像(被1所乘的部分),但是我们需要保证掩模图像的大小与原始图像的大小是相等的。接下来我们来自己构建一个掩模图像并相乘


1-2、构建掩模图像

        首先我们需要知道我们的原始图像是一个彩色图像,那么我们首先需要构建一个三维数组,然后把我们的原始图像的大小信息与通道数

import cv2
import numpy as npimg = cv2.imread("D:\\photo\\man.png",1)a,b,c = img.shapemask = np.zeros((a,b,c), dtype = np.uint8)

        这里的c即我们的通道数

        那么接下来我们将需要掩模的部位全部设置为1,随后相乘即可:

mask[100:500,200:500] = 1result = img * maskcv2.imshow("one",img)
cv2.imshow("two",mask*255)  这里设置为255是由于本来1就是深黑色,与周围分不清,这里将其变为白色
cv2.imshow("three",result)cv2.waitKey()
cv2.destroyAllWindows()

        我们的原始图像如下:

        我们的掩模图像如下:

        我们的最终图像如下:

        这样我们完成了掩模处理

1-3、逻辑运算

        这里不是真的在讲逻辑运算,我们知道根据按位与运算的规则,任意数值与数值 1 进行与运算,结果都等于其自身,那么对于opencv中的8位无符号二进制来说,任何数值与1111 1111(即255)进行与运算都是本身。

        那么我们在构建掩模图像的时候可以按照逻辑运算来构造(不是乘法运算),即将需要掩模的部位设置为 255即可,其他设置为0,代码如下:

import cv2 
import numpy as np 
o=cv2.imread("lenacolor.png",1) 
h,w,c=o.shape 
m=np.zeros((h,w,c),dtype=np.uint8) 
m[100:400,200:400]=255 
m[100:500,100:200]=255 
result=cv2.bitwise_and(o,m) 
cv2.imshow("original",o) 
cv2.imshow("mask",m) 
cv2.imshow("result",result) 
cv2.waitKey() 
cv2.destroyAllWindows() 

        其中result = cv2.bitwise_and(o , m)这个操作就是在进行按位与操作

1-4、函数下的掩模

        在opencv中的很多函数都有一个掩模参数,即如果我们加上一个掩模参数,那么函数操作的部分都会在掩模部分进行

        但有一个有意思的点是这个掩模区域的设置要求不怎么严格(并不需要设置为1或者255),只要是非零真值即可,其他部分设置为0.这里不做示例

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

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

相关文章

[LevelDB]关于LevelDB存储架构到底怎么设计的?

本文内容组织形式 LevelDB 存储架构重要特点总体概括LevelDB中内存模型MemTableMemTable的数据结构背景:SkipListSkiplist的数据结构 Skiplist的数据访问细节 SkipList的核心方法Node细节源代码 MemTable的数据加速方式Iterator 的核心方法 MemTable 的读取&写入…

【存储中间件】Redis核心技术与实战(四):Redis高并发高可用(Redis集群 Smart客户端、集群原理)

文章目录 Redis集群Smart客户端smart客户端原理ASK 重定向集群下的Jedis客户端Hash tags 集群原理节点通信通信流程Gossip 消息节点选择 故障转移故障发现主观下线客观下线 故障恢复资格检查准备选举时间发起选举选举投票替换主节点 故障转移时间 集群不可用判定集群读写分离 个…

【接口耗时】⭐️自定义拦截器实现接口耗时统计

💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时三分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…

杨校老师课堂之编程入门与软件安装【图文笔记】

亲爱的同学们,热烈欢迎踏入青少年编程的奇妙世界! 我是你们的授课老师杨校 ,期待与大家一同开启编程之旅。 1. 轻松叩开编程之门 1.1 程序的定义及生活中的应用 程序是人与计算机沟通的工具。在日常生活中,像手机里的各类 APP、电…

【从零开始】Air780EPM的LuatOS二次开发——OneWire协议调试注意事项!

当涉及到与传感器、执行器等外部设备交互时,OneWire协议的高效调试成为决定项目成败的关键环节。OneWire协议(单总线协议)以其仅需一根数据线即可实现设备通信的极简特性,被广泛应用于温度传感器、身份识别模块等场景。 一、LuatO…

redis数据结构、多路复用、持久化---java

数据结构 Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset&am…

vue3之写一个aichat ----vite.config.js

vite.config.js的CSS配置 postcss-pxtorem 开发响应式网页的时候需要用到postcss-pxtorem amfe-flexible amfe-flexible是由阿里团队开发的一个库,它可以根据设备的屏幕宽度去动态调整HTML根元素()的字体大小,这意味着无论用户使用什么尺寸的设备访问你…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章,是TD算法的拓展,本质上是将状态值与行为值的表征方式,从离散的表格形式,拓展到了连续的函数形式。 表格形式的优点是直观,便于分析,缺点是数据量较大或者连续性状态或者行为空间时…

C++模版(进阶)

文章目录 一、非类型模版参数二、模版的特化2.1 概念2.2 函数模版特化2.2.1 函数模版特化为指针类型注意事项 2.3 类模版特化2.3.1 全特化2.3.2 偏特化(半特化)2.3.3 类模板特化应用示例 三、模版分离编译3.1 什么是分离编译?3.2 模版的分离编译3.3 解决方法! 四、模…

Linux配置yum仓库,服务控制,防火墙

一、yum仓库 1.在安装软件时,首先第一步就是要考虑软件的版本的问题! 2.软件的安装:最安全可靠的方法就是去软件对应的官网上查看安装手册(包括的软件的下载) 红帽系软件安装的常见的3种方式 (1&#x…

布谷直播系统源码开发实战:从架构设计到性能优化

作为山东布谷科技的一名技术研发人员,我参与了多个直播系统平台从0到1的开发和搭建,也见证了直播行业从萌芽到爆发的全过程。今天,我想从研发角度,分享一些直播系统软件开发的经验和心得,希望能对大家有所帮助。 一、 …

实战设计模式之解释器模式

概述 作为一种行为设计模式,解释器模式提供了一种方法来定义语言的文法规则,并通过这些规则解析和处理特定类型的语言句子。简单来说,解释器模式允许我们定义一个代表某种语言中语法规则的对象结构,从而能够根据这些规则理解并处理…

物联网边缘计算网关是什么?

在物联网的浩瀚架构中,边缘计算网关宛如一位坚毅的前沿哨兵,默默守护着数据处理与传输的关键防线,为整个物联网系统的高效运转发挥着不可或缺的作用。 一、边缘计算网关的定义与基本功能 边缘计算网关是一种智能设备,它被部署在…

计算机视觉算法实战——障碍物识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​ ​​​​​​ ​ ​ 1. 引言 计算机视觉是人工智能领域的一个重要分支,旨在通过计算机模拟人类的视觉系统,从…

Win11锁屏后显示“天气、市场、广告”如何取消显示

关闭方法:设置>个性化>锁屏界面>锁屏界面状态>"无"。 方法一:通过“个性化”设置 打开“设置”应用: 点击屏幕左下角的“开始”按钮(Windows 图标)。点击齿轮状的“设置”图标。或者按下 Win I…

10天速通强化学习-008

TRPO 思考-TRPO-在线策略-给定信任区域防止更新不稳定 Actor-Critic网络随着网络深度的增加,步长太长,梯度更新会变差。改变方法-增加信任区域。(trust region policy optimization)-TRPO算法: 核心思想: 是在每次迭代中&…

整合百款经典街机游戏的模拟器介绍

对于80、90后而言,街机游戏承载着童年的欢乐记忆。今天要给大家介绍一款超棒的软件——「MXui街机厅经典游戏101款」,它能带你重回那段热血沸腾的街机时光。 「MXui街机厅经典游戏101款」是一款绿色免安装的街机模拟器,体积约1.39G。无需繁琐…

springboot第三站(1) web开发引入

目录 1.简介 2.SpringBoot对静态资源的映射规则 3.模版引擎 1.简介 使用SpringBoot; 1)、创建SpringBoot应用,选中我们需要的模块; 2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定…

12-二叉树-二叉树高度(给定前序和中序确定二叉树)

题目 来源 23. 二叉树的高度 思路 其实跟09那篇很像,反正核心就是要通过前序和中序来建树,只不过现在多了一个返回值;因为建树的时候,其实左子树和右子树的深度就可以知道。其余详见代码。 代码 /* 前序遍历根左右,中序&…

PSI5接口

文章目录 前言PSI5接口简介操作模式命名规则异步操作模式(PSI5-A)同步操作模式(PSI5-P) 传感器->ECU物理层(位编码)数据链路层数据帧帧格式串行消息帧10bits 传感器帧定义超10bits传感器帧定义 ECU->…