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

文章目录

        • 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.mzph.cn/news/691.shtml

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

相关文章

flutter开发实战-dio文件下载实现

flutter开发实战-dio文件下载实现 在开发中&#xff0c;需要下载文件&#xff0c;这里使用的是dio dio 是一个强大的 Dart HTTP 请求库&#xff0c;支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 一、引入d…

JS脚本 - 批量给所有指定标签追加Class属性

JS脚本 - 批量给所有指定标签追加Class属性 前言一. 脚本二. 测试运行 前言 公司里我们有个应用引入了UBT埋点&#xff0c;记录了页面上所有的点击操作以及对应的点击按钮。但是我们看下来发现&#xff0c;我们需要给每个按钮加一个唯一标识做区分&#xff0c;并且这个ID是给U…

Flask 使用Flask的session来保存用户登录状态例子

使用Python的Flask库实现的登录接口、查询金额接口和注销接口的示例。 当用户发送POST请求到/login接口时&#xff0c;代码会获取请求中的用户名和密码。如果用户名和密码匹配&#xff08;在示例中是admin和admin123&#xff09;&#xff0c;则会将用户名保存在session中&…

吴恩达机器学习2022-Jupyter特征缩放

1可选实验室: 特征缩放和学习率(多变量) 1.1 目标 在这个实验室里: 利用前一实验室开发的多变量线性回归模型程序在具有多种功能的数据集上运行梯度下降法探讨学习速度 alpha 对梯度下降法的影响通过使用 z 分数标准化的特征缩放来提高梯度下降法的性能 1.2 工具 您将使用…

Python爬虫学习笔记(三)————urllib

目录 1.使用urllib来获取百度首页的源码 2.下载网页图片视频 3.总结-1 4.请求对象的定制&#xff08;解决第一种反爬&#xff09; 5.编解码 &#xff08;1&#xff09;get请求方式&#xff1a;urllib.parse.quote&#xff08;&#xff09; &#xff08;2&#xff09;get请求…

RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

文章目录 一、使用Zookeeper的意义二、Zookeeper基础1 文件系统2 通知机制3 原生zkclient API存在的问题4 服务配置中心Zookeeper模块 三、Zk类实现Start方法创建节点、get节点值方法 四、框架应用rpc提供端框架rpc调用端&#xff08;客户端&#xff09;框架 总结 一、使用Zook…

flutter开发实战-生日等日期选择器DatePicker

flutter开发实战-生日等日期选择器DatePicker 在开发遇到设置生日等信息需要选择日期&#xff0c;这里用到的是CupertinoDatePicker iOS效果的日期、时间选择器 一、效果图 运行后效果图如下 二、代码实现 我们需要调用底部弹窗显示 //显示底部弹窗static void bottomShe…

Python实现PSO粒子群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

H3C-Cloud Lab实验-三层交换机实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. 按照图示为 PC2 和 PC3 配置 IP 地址和网关 2. PC2 属于 Vlan10&#xff0c;PC3 属于 Vlan20&#xff0c;在三层交换机上配置 Vlanif 三层接口实现 Vlan10 和 Vlan20 三层互通 3. PC2 和 PC3 可以互通 实验步骤&#xff1a…

WEB:Web_php_include(多解)

背景知识 文件包含 file://协议 php://协议 data://协议 了解strstr函数 题目 <?php show_source(__FILE__); echo $_GET[hello]; /*可以构造payload*/ $page$_GET[page]; while (strstr($page, "php://")) { /*strstr()函数*/$pagestr_replace("php://&q…

Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十&#xff09;自定义action names【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue httprunner …

在外Windows远程连接MongoDB数据库【无公网IP】

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自cpolar极点云文章&#xff1a;公网远程…

论文阅读-2:基于深度学习的大尺度遥感图像建筑物分割研究

一、该网络中采用了上下文信息捕获模块。通过扩大感受野&#xff0c;在保留细节信息的同时&#xff0c;在中心部分进行多尺度特征的融合&#xff0c;缓解了传统算法中细节信息丢失的问题&#xff1b;通过自适应地融合局部语义特征&#xff0c;该网络在空间特征和通道特征之间建…

docker服务启动过程分析

How docker.service start&#xff1f; just by ref 我们先了解docker的各个核心组件的介绍 runc&#xff1a;runc实现了容器的底层功能&#xff0c;例如创建、运行等。runc通过调用内核接口为容器创建和管理cgroup、namespace等Linux内核功能&#xff0c;来实现容器的核心特…

PyTorch预训练和微调:以VGG16为例

文章目录 预训练和微调代码测试结果参考来源 预训练和微调代码 数据集&#xff1a;CIFAR10 CIFAR-10数据集由10类32x32的彩色图片组成&#xff0c;一共包含60000张图片&#xff0c;每一类包含6000图片。其中50000张图片作为训练集&#xff0c;10000张图片作为测试集。数据集介…

SolidUI AI生成可视化,0.1.0版本模块划分以及源码讲解

1.背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…

【微信小程序-uniapp】CustomDialog 居中弹窗组件

1. 效果图 2. 组件完整代码 <template><uni-popup :ref="ref" type="center" @change

Ubuntu下配置Redis哨兵集群

目录 准备实例和配置 启动哨兵集群 测试配置 搭建一个三节点形成的Sentinel集群&#xff0c;来监管Redis主从集群。 三个sentinel哨兵实例信息如下&#xff1a; 节点IPPORTs1192.168.22.13527001s2192.168.22.13527002s3192.168.22.13527003 准备实例和配置 要在同一台虚…

组合式API

文章目录 前言了解组合式API简单类型 ref封装对象类型 user.name子组件数组类型 reactive封装 组合式 API 基础练习基础练习优化 前言 Vue 3 的组合式 API&#xff08;Composition API&#xff09;是一组函数和语法糖&#xff0c;用于更灵活和可组合地组织 Vue 组件的代码逻辑…

leetcode 538. 把二叉搜索树转换为累加树

2023.7.16 这道题利用中序遍历&#xff08;右中左&#xff09;的操作不断修改节点的值即刻&#xff0c;直接看代码&#xff1a; class Solution { public:TreeNode* convertBST(TreeNode* root) {stack<TreeNode*> stk;//前面的累加值int pre_value 0;TreeNode* cur r…