OpenCV中掩膜(mask)图像的创建和使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

功能描述

掩模图像(Mask Image)是一种特殊类型的形象数据,在图像处理和计算机视觉中扮演着重要角色。它通常是一个二维数组,与原始图像具有相同的尺寸,其上的每个像素值用来指示对应于原始图像中像素的处理方式。掩模图像主要使用两种基本值:非零值(通常是白色,255)和零值(通常是黑色,0)。这些值分别代表“感兴趣区域”(ROI, Region of Interest)和不感兴趣的区域。

掩模的主要用途包括:

区域选择:在图像处理操作中,仅对掩模中标记为非零的区域应用滤镜、颜色调整或其他效果,而忽略零值区域。
形状提取:结合位运算,从复杂图像中精确提取特定形状或对象。
图像分割:帮助分离前景和背景,尤其是在对象识别和跟踪任务中。
Alpha通道:在图形设计中,掩模可以作为alpha通道来控制透明度,实现图像合成。
数据屏蔽:在数据分析中,用于排除不需要分析的数据部分。
形态学操作:结合膨胀、腐蚀等操作,用于特征增强或去除噪声。

fillPoly() 函数

fillPoly() 的功能是填充由一个或多个多边形所限定的区域。
cv::fillPoly函数用于填充由多个多边形轮廓所限定的区域。该函数能够填充复杂的区域,例如含有空洞的区域、自身相交的轮廓(它们的部分),等等。

原型1


void cv::fillPoly	
(	InputOutputArray 	img,InputArrayOfArrays 	pts,const Scalar & 	color,int 	lineType = LINE_8,int 	shift = 0,Point 	offset = Point() 
)		

参数1

  • 参数 img 图像.
  • 参数 pts 多边形数组,其中每个多边形由顶点数组表示。
  • 参数 color 多边形颜色.
  • 参数 lineType 多边形边线的颜色. 见 LineTypes
  • 参数 shift 顶点坐标中的小数位数.
  • 参数 offset 可选参数,轮廓上所有点的偏移量.

原型2


void cv::fillPoly	
(	
InputOutputArray 	img,
const Point ** 	pts,
const int * 	npts,
int 	ncontours,
const Scalar & 	color,
int 	lineType = LINE_8,
int 	shift = 0,
Point 	offset = Point() 
)		

参数2

  • 参数 img 图像.
  • 参数 pts 多边形数组,其中每个多边形由顶点数组表示。
  • 参数 npts 多边形数组的个数。
  • 参数 ncontours 轮廓的数量
  • 参数 color 多边形颜色.
  • 参数 lineType 多边形边线的颜色. 见 LineTypes
  • 参数 shift 顶点坐标中的小数位数.
  • 参数 offset 可选参数,轮廓上所有点的偏移量.

bitwise_and()函数

函数cv::bitwise_and用于计算两个数组或一个数组与一个标量之间的逐元素按位逻辑与运算。具体规则如下:

  1. 当src1和src2尺寸相同时:
    对于数组中的每个元素I,若mask(I)不等于0,则执行按位与运算:
    dst ( I ) = src1 ( I ) ∧ src2 ( I ) if mask ( I ) ≠ 0 \texttt{dst} (I) = \texttt{src1} (I) \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0 dst(I)=src1(I)src2(I)if mask(I)=0
    这意味着只有当mask在该位置上为非零值时,才会在dst中存储src1和src2对应位置的按位与结果。
  2. 一个数组和一个标量运算,当src2由Scalar构造或其元素数量与src1.channels()相同:
    同样地,若mask(I)非零,则dst中的元素通过src1的元素与标量src2的按位与得到:
    dst ( I ) = src1 ( I ) ∧ src2 if mask ( I ) ≠ 0 \texttt{dst} (I) = \texttt{src1} (I) \wedge \texttt{src2} \quad \texttt{if mask} (I) \ne0 dst(I)=src1(I)src2if mask(I)=0
    这里,标量src2会被转换成与src1相同类型的数组,然后进行逐元素运算。
  3. 一个标量和一个数组运算,当src1由Scalar构造或其元素数量与src2.channels()相同:
    类似地,若mask(I)非零,则按位与的结果由src1和src2(I)决定:
    dst ( I ) = src1 ∧ src2 ( I ) if mask ( I ) ≠ 0 \texttt{dst} (I) = \texttt{src1} \wedge \texttt{src2} (I) \quad \texttt{if mask} (I) \ne0 dst(I)=src1src2(I)if mask(I)=0
    这里,src1作为标量参与运算,先被转换为与src2相同类型的数组形式。

对于浮点数数组,它们的按位运算基于机器特定的位表示(通常是遵循IEEE754标准)。而对于多通道数组,每个通道独立进行上述操作。在后两种情况中,标量会首先被转换为与数组相匹配的类型,然后再进行运算。

原型

void cv::bitwise_and	
(	InputArray 	src1,InputArray 	src2,OutputArray 	dst,InputArray 	mask = noArray() 
)		

参数

  • 参数 src1 第一个输入数组或一个标量.
  • 参数 src2 第二个输入数组或一个标量.
  • 参数 dst 输出数组,与输入数组具有相同的尺寸和类型.
  • 参数 mask 可选的操作掩码,一个8位单通道数组,用于指定输出数组中需要更改的元素.

代码示例

以下代码,可以在Source窗口中用鼠标左键点击选择点,这些点就是轮廓的顶点,在你点击的时候,会把点用线连起来,形成轮廓,然后点击右键开始创建掩膜。单击中键重新开始画轮廓。

#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
Mat src, img1, mask, final;
Point point;
vector< Point > pts;
int drag = 0;
int var  = 0;
int flag = 0;
void mouseHandler( int, int, int, int, void* );
void mouseHandler( int event, int x, int y, int, void* )
{if ( event == EVENT_LBUTTONDOWN && !drag ){if ( flag == 0 ){if ( var == 0 )img1 = src.clone();point = Point( x, y );circle( img1, point, 2, Scalar( 0, 0, 255 ), -1, 8, 0 );pts.push_back( point );var++;drag = 1;if ( var > 1 )line( img1, pts[ var - 2 ], point, Scalar( 0, 0, 255 ), 2, 8, 0 );imshow( "Source", img1 );}}if ( event == EVENT_LBUTTONUP && drag ){imshow( "Source", img1 );drag = 0;}if ( event == EVENT_RBUTTONDOWN ){flag = 1;img1 = src.clone();if ( var != 0 ){polylines( img1, pts, 1, Scalar( 0, 0, 0 ), 2, 8, 0 );}imshow( "Source", img1 );}if ( event == EVENT_RBUTTONUP ){flag  = var;final = Mat::zeros( src.size(), CV_8UC3 );mask  = Mat::zeros( src.size(), CV_8UC1 );fillPoly( mask, pts, Scalar( 255, 255, 255 ), 8, 0 );bitwise_and( src, src, final, mask );imshow( "Mask", mask );imshow( "Result", final );imshow( "Source", img1 );}if ( event == EVENT_MBUTTONDOWN ){pts.clear();var  = 0;drag = 0;flag = 0;imshow( "Source", src );}
}
int main( int argc, char** argv )
{cout << "\n\tleft mouse button - set a point to create mask shape\n""\tright mouse button - create mask from points\n""\tmiddle mouse button - reset\n";src = imread( "/media/dingxin/data/study/OpenCV/sources/images/fruit.jpg", cv::IMREAD_GRAYSCALE );if ( src.empty() ){printf( "Error opening image" );return 0;}Size sz2Sh( 300, 300 );Mat queryToShow;resize( src, src, sz2Sh, 0, 0, INTER_LINEAR_EXACT );namedWindow( "Source", WINDOW_AUTOSIZE );setMouseCallback( "Source", mouseHandler, NULL );imshow( "Source", src );waitKey( 0 );return 0;
}

运行结果

原始图:
在这里插入图片描述

画轮廓过程:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
掩膜图:
在这里插入图片描述
应用结果图:
在这里插入图片描述

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

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

相关文章

java:aocache:基于aspectJ实现的方法缓存工具

背景 最近一直在做一些服务端的设计&#xff0c;经常遇到常量计算的问题&#xff0c;比如获取查找一个类的所有方法&#xff0c;获取有指定注解(Annnotation)的方法并查找注解的上特定的元注解是否有特定的值 。。。。总之逻辑很复杂&#xff0c;而且会频繁调用。 比如在服务端…

Java面试问题(一)

一.Java语言具有的哪些特点 1.Java是纯面向对象语言&#xff0c;能够直接反应现实生活中的对象 2.具有平台无关性&#xff0c;利用Java虚拟机运行字节码文件&#xff0c;无论是在window、Linux还是macOS等其他平台对Java程序进行编译&#xff0c;编译后的程序可在其他平台上运行…

HuatuoGPT2本地运行失败

transformer 版本不能太高 transformer<4.3.32 查看config.json文件 其实 https://huggingface.co/FreedomIntelligence/HuatuoGPT2-7B/blob/main/config.json

2024年03月Python六级真题+答案(中国电子学会 )

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1.以下选项中&#xff0c;创建类正确的是&#xff1f;&#xff08; &#xff09; A. class test1…

利用opencv自带的Haar级联分类器模型

OpenCV自带的Haar级联分类器模型&#xff1a; haarcascade_eye.xml: 这个模型用于检测眼睛。 haarcascade_eye_tree_eyeglasses.xml: 这个模型用于检测眼镜。 haarcascade_frontalcatface.xml: 这个模型用于检测猫脸。 haarcascade_frontalcatface_extended.xml: 这个模型用…

企业成功的秘诀:全面解读ISO三大管理体系的卓越效益

在现代商业环境中&#xff0c;企业若想在激烈竞争中脱颖而出并保持可持续经营&#xff0c;必须关注质量、环境以及职业健康安全管理。ISO三大管理体系——质量管理体系、环境管理体系和职业健康安全管理体系&#xff0c;为企业提供了实现这一目标的有力工具。本文将详细介绍ISO…

存储故障导致Oracle 19c 数据文件处于recover状态的恢复案例

1.背景 某次平台分布式存储故障&#xff0c;导致数据库出现ORA-00376、ORA-01110数据文件不可读报错&#xff0c;本文将整个恢复过程进行整理记录。 2.报错信息 在进行租户数据库打开操作时&#xff0c;出现了如下报错&#xff1a; ORA-00376: file 17 cannot be read at t…

Vue3抽屉(Drawer)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传width宽度&#xff0c;在 placement 为 right 或 left 时使用string | number378falseheight高度&#xff0c;在 placement 为 top 或 bottom 时使用string | number378falsetitle标题string | slotundefinedfalse…

iCloud备份的智能压缩与优化:释放存储空间的艺术

iCloud备份的智能压缩与优化&#xff1a;释放存储空间的艺术 iCloud作为Apple提供的云服务&#xff0c;不仅为用户带来了便捷的数据同步功能&#xff0c;还通过智能的备份压缩和优化存储选项&#xff0c;帮助用户高效管理存储空间。本文将详细解析iCloud备份的压缩和优化存储功…

《Nest系列 - 4. 听说人人都会CRUD,可是我还不会怎么办???-《4.2结合前端使用实现CRUD》

终于到了这一步&#xff0c;今天我们就将实现一个CRUD&#xff0c;主要是编写nest 部分&#xff0c;前端部分后面可以看git 代码 下面是效果演示&#xff08;大部分是参考满哥实现&#xff0c;&#x1f923;&#x1f923;&#x1f923;&#xff09; 前期准备 前端接口处理 im…

产业升级具体可从哪些方面入手?

产业升级是一个广泛而复杂的过程&#xff0c;涉及多个方面。以下是产业升级的主要方面&#xff0c;结合参考文章中的相关信息进行清晰分点表示和归纳&#xff1a; 技术创新&#xff1a; 研发和技术改造&#xff1a;通过不断投入研发和技术改造&#xff0c;推动企业生产技术的升…

RT-Thread Studio实现动态线程

1创建项目 我的板子为STM32F03ZET6 点击RT-Thread项目 2选择板子&#xff08;根据自己的板子选择&#xff09; 3找到主函数 4编写代码 4-1创建函数入口 // 线程入口函数 static void thread_entry(void *parameter) {rt_uint32_t count 0;while (1){// 线程执行的代码rt_k…

互斥锁并不能保证任务不能被调度

互斥锁不能保证在临界区的时候&#xff0c;不发送任务调度&#xff0c;所以为了保护共享的资源不被调度访问&#xff0c;需要在两个线程都加互斥锁来保证任务不调度 #include <stdio.h> #include <pthread.h> #include <unistd.h> int shared_resource 0;p…

2025中国(宁波)出口跨境电商博览会

2025中国(宁波)出口跨境电商博览会 时间&#xff1a;2025年5月28-30日 地点&#xff1a;中国宁波国际会展中心 组织单位&#xff1a; 宁波欧德国际商务咨询服务有限公司 凤麟展览(宁波)有限公司 宁波市跨境电子商务协会 宁波市家居产业协会 详询主办方陆先生 I38&…

Java yield()方法在多线程编程中的应用

目录 背景: 代码解释: 1.类定义 2.主方法(main) 3.自定义线程类(MyThread3) 总结: 背景: 在Java中&#xff0c;多线程是构建并发应用程序的关键技术。当我们多个线程需要同时执行时&#xff0c;操作系统必须决定何时为每个线程分配 CPU时。这个过程被称为线程调度&#x…

php中interface接口类,abstract抽象类和trait详解

在PHP中&#xff0c;interface&#xff08;接口&#xff09;、abstract class&#xff08;抽象类&#xff09;和trait都是为了实现代码的复用、提高可维护性和灵活性而设计的。它们各自有不同的用途和特点&#xff1a; Interface&#xff08;接口&#xff09; 用途&#xff1…

上海市计算机学会竞赛平台2023年7月月赛丙组模糊匹配(二)

题目描述 有两个仅包含大写英文字母的字符串 &#x1d446;,&#x1d447;S,T&#xff0c;且字符串 &#x1d447;T 是 &#x1d446;S 的一个子串。 但由于字符串 &#x1d446;S 字迹模糊不清&#xff0c;其某些位置上的字符没有办法进行辨认&#xff0c;这些模糊的位置&am…

星戈瑞DSPE-FITC细胞成像:一种细胞可视化技术

细胞成像技术是现代生物医学研究中的工具&#xff0c;它为我们提供了一种直观、深入地了解细胞结构和功能的方法。其中&#xff0c;DSPE-FITC作为一种荧光标记分子&#xff0c;在细胞成像领域展现出了优势。 DSPE-FITC细胞成像的原理 DSPE-FITC是由磷脂酰丝氨酸&#xff08;DS…

【openmpi】怎样使用openmpi并行运行python脚本?

创作日志&#xff1a; 装过一次openmpi&#xff0c;但是半年之后就忘记怎么用了&#xff0c;所以记录一下 1. 测试openmpi是否安装好 cd /home/xxxx/SnapHiC_Call_Loop/openmpi-4.1.6/examples make mpirun -np 4 hello_c得到如下输出就说明是装好的了 2. 没有导入路径的话导…

rtthread stm32h743的使用(十)i2c设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.打开cubemux&#xff0c;设置外部时钟及串口外设…