OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

news2024/10/6 14:35:56

文章目录

        • 1、掩膜(Mask)是什么
          • (1)从物理的角度来看:
          • (2)图像处理中的掩膜Mask
          • (3)掩膜的用法:
          • (4)掩膜Mask 的运算:
        • 2、setTo()函数:将图像的像素值,设置为某个值;
          • (1)函数使用:
        • 3、copyTo()函数:将一张图像复制到另一张图像上;
          • (1)函数使用:
        • 4、clone()函数:克隆一个图像
          • (1)函数使用:
        • 5、inRange()函数:提取指定色彩范围区域(用法是将一副彩色图像或者一副单通道图像转换为二值图像)
          • (1)函数原型
          • (2)参数解释
          • (3)示例
            • 比如将下图绿色区域,提取出来:
            • 运行结果:

1、掩膜(Mask)是什么

(1)从物理的角度来看:

光刻是指利用光学复制的方法,把pcb电路图,印制在光敏记录材料上(这个光敏材料就是很薄的一层膜,我称之为掩膜Mask),用掩膜Mask 遮盖硅片,把掩膜Mask 上精细的电路图,通过光线的曝光印制到硅片上,来制作芯片;

(2)图像处理中的掩膜Mask

图像掩膜与其类似,用选定的图像作为遮挡,来控制图像处理的区域;

(3)掩膜的用法:
  • 提取感兴趣区:用预先制作的感兴趣区掩膜 与 待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;
  • 屏蔽作用:用掩膜对图像上某些区域作屏蔽,使其不参加处理,仅对屏蔽区外作处理;
  • 结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;
  • 特殊形状图像的制作;
(4)掩膜Mask 的运算:

一个3 * 3的图像 与 一个3 * 3的掩膜进行运算,得到的结果图像如下:

在这里插入图片描述

2、setTo()函数:将图像的像素值,设置为某个值;

(1)函数使用:
src.setTo(value);		// 将图像src的值,全部设成value
src.setTo(value, src<m);	// src像素值小于m的像素值,全部设成value
src.setTo(value, src>m);	// src像素值大于m的像素值,全部设成value
src.setTo(dst, src<m);		// src中的像素值,当其值小于m的时候,就将该值用dst中相应位置的值进行替换

3、copyTo()函数:将一张图像复制到另一张图像上;

(1)函数使用:
函数原型1void copyTo( OutputArray m ) const;
举例:image_in.copyTo(image_out);
解释:把image_in这张图复制到image_out上;

函数原型2void copyTo( OutputArray m, InputArray mask ) const;
举例:image_in.copyTo(image_out,mask);
解释:image_in图像与掩膜mask进行,逻辑与 &运算,将运算后的图像复制到image_out上;(image_in对应mask中像素值为0的像素点都不会贴到image_out上)

4、clone()函数:克隆一个图像

(1)函数使用:
Mat A  = Mat::ones(4,5,CV_32F);
Mat B = A.clone()	// clone() 是完全的深拷贝,在内存中申请新的空间;
Mat C;
A.copyTo(C);		// 此处的C矩阵大小与A大小不一致,则申请新的内存空间,并完成拷贝,等同于clone()
Mat D = A.col(1);
A.col(0).copyTo(D)	// 此处D矩阵大小与A.col(0)大小一致,因此不会申请空间,而是直接进行拷贝,相当于把A的第1列赋值给D

5、inRange()函数:提取指定色彩范围区域(用法是将一副彩色图像或者一副单通道图像转换为二值图像)

  • inRange()函数输出的是一幅二值化之后的图像,将阈值区间内的像素值,设置为白色(255),不在阈值区间内的像素值,设置为黑色(0);
  • inRange()函数,应在hsv色彩空间下处理图像,所以输入的图像需要先转化为hsv图像(因为在RGB色彩空间下,颜色值分布的太多太广,我们很难准确的去提取选定区域的像素值,但在hsv色彩空间下只有h和s这两个控制颜色,很容易对颜色进行提取,所以当你看到一个单一颜色的时候,你想要寻找到它,你的第一反应应该是,将他转换到辨识度比较高的色彩空间下,比如hsv,hsi,lab等,处理完之后再返回rgb就可以了);
(1)函数原型
inRange(hsv, Scalar(hmin, smin, vmin), Scalar(hmax, smax, vmax), dst);
(2)参数解释
  • hsv:输入要处理的图像,可以为单通道或多通道图像,先转化为hsv图像,使用cvtColor();
  • Scalar(hmin, smin, vmin):下边界数组或标量,输入hsv图像像素值,小于此值,设置为黑色(0),在区间范围内设为白色(255);
  • Scalar(hmax, smax, vmax):上边界数组或标量,输入hsv图像像素值,大于此值,设置为黑色(0),在区间范围内设为白色(255);
  • dst:输出图像,与输入图像hsv 尺寸相同且为CV_8U 类型;
(3)示例
  • 针对单通道图像:一幅灰度图像的某个像素的灰度值在指定的高、低阈值范围之内,则在dst图像中令该像素值为255,否则令其为0,这样就生成了一幅二值化的输出图像;
  • 针对三通道图像:每个通道的像素值都必须在规定的阈值范围内;
  • Scalar(hmin, smin, vmin),Scalar(hmax, smax, vmax)里hsv值如何确定,这里我的方法是先得到RGB,再通过菜鸟教程工具来转化得到hsv,确定我要提取图像的范围,这样将范围填写进Scalar(h, s, v),就可以了;
  • 将RGB输入到菜鸟工具后,得到的hsv是小数,我们将h乘以180,s和v乘以255得到想要的Scalar(h, s, v);
比如将下图绿色区域,提取出来:

在这里插入图片描述

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	// 读取图像,BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\green.png");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}
	namedWindow("src", WINDOW_NORMAL);
	namedWindow("hsv", WINDOW_NORMAL);
	namedWindow("dst", WINDOW_NORMAL);

	imshow("src", src);
	// 1、先转化为hsv图像
	Mat hsv;
	cvtColor(src, hsv, COLOR_BGR2HSV);
	imshow("hsv", hsv);
	// 2、再利用inRange()函数对图像二值化
	Mat dst;
	inRange(hsv, Scalar(45, 254, 204), Scalar(46, 255, 206), dst);
	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
	return 0;
}

运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动手学习深度学习--逐行代码解析合集】17使用块的网络(VGG)

【动手学习深度学习】逐行代码解析合集 17使用块的网络&#xff08;VGG&#xff09; 视频链接&#xff1a;动手学习深度学习–使用块的网络&#xff08;VGG&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、VGG网络…

【UniApp开发小程序】顶部导航栏和底部导航栏设置+iconfont图标引入

文章目录 顶部导航栏和底部导航栏设置创建几个需要底部导航栏切换的页面使用阿里巴巴矢量图标库完成底部导航栏tabBar设置页面顶部导航栏标题 样式优化 顶部导航栏和底部导航栏设置 在正式开发小程序的功能之前&#xff0c;首先需要确定小程序的主要框架。 创建几个需要底部导…

组件的创建,引用,样式隔离以及methods,data,properties和数据事件监听

组件的创建&#xff0c;引用&#xff0c;样式隔离以及methods,data,properties和数据事件监听 1. 组件的创建2. 组件的引用2.1. 局部引用2.2. 全局引用2.3. 组件和页面的区别 3. 组件的样式隔离3.1. 默认情况&#xff0c;组件样式隔离性3.2. 修改组件的样式隔离选项 4. 组件的d…

短视频抖音seo矩阵系统源码开发者思路(一)

一套优秀的短视频获客系统&#xff0c;支持短视频智能剪辑、短视频定时发布&#xff0c;短视频排名查询及优化&#xff0c;短视频智能客服等&#xff0c;那么短视频seo系统具体开发应该具备哪些功能呢&#xff1f;今天小编就跟大家分享一下我们的技术开发思路。 抖音矩阵系统源…

go-zero微服务实战——etcd服务注册与发现

etcd简介 浅谈etcd服务注册与发现 etcd官网 etcd中文文档 apt安装etcd&#xff0c;启动命令十分简单etcd。 etcd分为v2版本和v3版本&#xff0c;命令有所不一样&#xff0c;使用命令etcdctl h查看 如上图所示并没有出现API的版本&#xff0c;此时是使用默认的v2版本&#x…

android editText获取不到数据

问题分析&#xff1a;在onActivityCreated一开始就创建了findViewById&#xff0c;这时获取的是默认值&#xff0c;需要在点击按钮时重新加载才能获取到输入数据。 需要在点击按钮时重新加载数据&#xff1a;

Android Studio中java编程时禁止生成警告

1、打开Android Studio&#xff0c;进入主界面 2、进入软件后&#xff0c;点击菜单栏的File 3、在File选项中选择Settings 4、进入Settings选择Version Control -> Subversion -> Presentation 5、去掉勾选 Show merge source in history and anotations 6、最后点击确定…

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型 用到的区域文件、地图标记文件、路径信息文件、模型文件 提取码&#xff1a;99jq 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium…

一文详解常见标准化组织

从事软件研发工作多年&#xff0c;在工作中有时会查阅一些通信相关的国际标准。然而&#xff0c;对于制定这些标准的组织&#xff0c;一直缺乏一个系统的了解。本文将对几个常见的标准化组织进行介绍&#xff0c;其中包括ITU、3GPP、GSMA和CCSA&#xff0c;了解它们的背景、成立…

零基础学习C#编程的步骤和建议

如果你是零基础&#xff0c;希望学习C#编程语言&#xff0c;以下是一些建议的学习步骤&#xff1a; 基础概念和语法&#xff1a;开始学习C#之前&#xff0c;了解基本的编程概念和语法是很重要的。可以通过在线教程、编程书籍或视频教程来学习C#的基础知识&#xff0c;包括变量…

JVM中类加载的过程

文章目录 一、类加载是什么二、类加载过程1.加载2.验证3.准备4.解析5.初始化 三、什么时候进行类加载四、双亲委派模型1.三大类加载器2.加载过程 总 一、类加载是什么 把.class文件加载到内存中&#xff0c;得到类对象的过程。 二、类加载过程 1.加载 找到.class文件&#xff…

数据预处理matlab

matlab数据的获取、预处理、统计、可视化、降维 数据的预处理 - MATLAB & Simulink - MathWorks 中国https://ww2.mathworks.cn/help/matlab/preprocessing-data.html 一、数据的获取 1.1 从Excel中获取 使用readtable() 例1&#xff1a; 使用spreadsheetImportOption…

给大家推荐几款好用的格式转换工具

在数字化时代&#xff0c;我们经常需要处理各种不同的文件格式。有时我们可能需要将视频转换为适用于特定设备的格式&#xff0c;有时又需要将音频文件转换为可编辑的格式&#xff0c;或者将文档转换为更通用的类型。这就是格式转换工具的重要性所在。然而&#xff0c;在众多的…

纯css3实现小鸡从鸡蛋破壳而出动画特效

实现一个使用纯css3实现小鸡破壳的效果 示例效果如下所示 示例代码 <template><div><div class"eggWrapper"><div class"chickHead"><div class"eyeDiv"></div><div class"eyeDiv"></di…

一文详解 Okio 输入输出流

在 OkHttp 的源码中&#xff0c;我们经常能看到 Okio 的身影&#xff0c;这篇文章&#xff0c;我们把Okio拿出来进行一个详细的介绍学习。 输入输出的概念简述Okio 简介工程中引入 OkioAPI 简介及使用介绍 一、输入输出 在正式介绍 Okio 之前&#xff0c;让我们先回忆一下输…

STM32自学笔记14-步进电机驱动项目-TB67H450驱动

目前的项目是一种2相4线步进电机的闭环驱动电路&#xff0c;使用的电机驱动芯片是TB67H450&#xff0c;再使用磁编码器MT6816&#xff0c;使用FOC算法&#xff0c;基于STM32F1单片机。 这一节是步进电机的驱动芯片驱动研究 首先研究驱动芯片TB67H450的datasheet 这是一个PWM斩…

11_SPI_Flash 读数据实验

11_SPI_Flash 读数据实验 1. 实验目标2. 操作时序2.1 数据读操作指令2.2 数据读操作时序 3. 流程框图3.1 顶层模块3.2 数据读模块 4. 波形图绘制5. RTL5.1 flash_read_ctrl5.2 spi_flash_read 6. testbench 1. 实验目标 使用页写或连续写操作向 Flash 芯片写入数据&#xff0c…

火山引擎 DataLeap 构建Data Catalog系统的实践(三):关键技术与总结

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 关键技术 构建一个好的Data Catalog系统&#xff0c;需要考虑的核心产品设计和技术设计有很多。篇幅所限&#xff0c;本文只概要介绍技术设计中最核心重要的部分&a…

工作日志2 input 的事件优先级 字符串.trim() this.$set()的应用 获取jq的自定义属性

input 的事件优先级 1.input输入框的事件 字符串.trim() 除去前后空格的方法 undefind不可以使用 this.$set()的应用

苹果Mac动态壁纸软件Dynamic Wallpaper

Dynamic Wallpaper 是一款桌面壁纸管理软件&#xff0c;它提供了动态壁纸的功能。动态壁纸是指可以在一段时间内自动更改外观的壁纸&#xff0c;比如根据时间或其他条件进行变化。这种壁纸可以为用户提供更加生动有趣的桌面体验。 Dynamic Wallpaper 软件具有以下特点和功能&am…