详解掩膜mask
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解掩膜mask
什么是掩膜(mask)
数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯⽚⼯艺步骤采⽤光刻技术,⽤于这些步骤的图形“底⽚”称为掩膜(也称作“掩模”),其作⽤是:在硅⽚上选定的区域中对⼀个不透明的图形模板遮盖,继⽽下⾯的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,⽤选定的图像、图形或物体,对处理的图像(全部或局部)进⾏遮挡,来控制图像处理的区域或处理过程。
光学图像处理中,掩模可以是胶⽚、滤光⽚等。
数字图像处理中,掩模为⼆维矩阵数组,有时也⽤多值图像。
数字图像处理中,图像掩模主要⽤于:
①提取感兴趣区,⽤预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,⽽区外图像值都为0。
②屏蔽作⽤,⽤掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,⽤相似性变量或图像匹配⽅法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。
掩膜是⼀种图像滤镜的模板,实⽤掩膜经常处理的是遥感图像。
当提取道路或者河流,或者房屋时,通过⼀个n*n的矩阵来对图像进⾏像素过滤,然后将我们需要的地物或者标志突出显⽰出来。
这个矩阵就是⼀种掩膜。
⽤选定的图像、图形或物体,对待处理的图像(全部或局部)进⾏遮挡,来控制图像处理的区域或处理过程。
⽤于覆盖的特定图像或物体称为掩模或模板。
光学图像处理中,掩模可以⾜胶⽚、滤光⽚等。
数字图像处理中,掩模为⼆维矩阵数组,有时也⽤多值图像。
数字图像处理中,图像掩模主要⽤于:①提取感兴趣区,⽤预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,⽽区外图像值都为0。
②屏蔽作⽤,⽤掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,⽤相似性变量或图像匹配⽅法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。
'掩膜
在OpenCV中我们经常会遇到⼀个名字:Mask(掩膜)。
很多函数都使⽤到它,那么这个Mask到底什么呢?
⼀开始我接触到Mask这个东西时,我还真是⼀头雾⽔啊,也对⽆法理解Mask到底有什么⽤。
经过查阅⼤量资料后,也对Mask有⼀点⾃⼰的理解了,下⾯就说说我的理解。
⽐如我要对⼀幅图进⾏抠图操作,这就要⽤到Mask了,那我就以抠图为例,解释Mask在⾥⾯的作⽤。
先上程序,再⼀句⼀句剖析。
该程序的功能就是抠出指定区域。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
Mat image, mask;
Rect r1(100, 100, 250, 300);
Mat img1, img2, img3, img4;
image = imread("lol17.jpg");
mask = Mat::zeros(image.size(), CV_8UC1);
mask(r1).setTo(255);
img1 = image(r1);
image.copyTo(img2, mask);
image.copyTo(img3);
img3.setTo(0, mask);
imshow("Image sequence", image);
imshow("img1", img1);
imshow("img2", img2);
imshow("img3", img3);
imshow("mask", mask);
waitKey();
return 0;
}
原始图
注意程序中的这两句关于Mask的操作。
mask = Mat::zeros(image.size(), CV_8UC1);
mask(r1).setTo(255); //r1是设置好的感兴趣区域
解释⼀下上⾯两句的操作。
第⼀步建⽴与原图⼀样⼤⼩的mask图像,并将所有像素初始化为0,因此全图成了⼀张全⿊⾊图。
第⼆步将mask图中的r1区域的所有像素值设置为255,也就是整个r1区域变成了⽩⾊。
这样就能得到Mask图像了。
注意这句,哪个图像拷贝到哪个图像?
image.copyTo(img2, mask);
当然是原始图image拷贝到⽬的图img2上啦。
其实拷贝的动作完整版本是这样的:
原图(image)与掩膜(mask)进⾏与运算后得到了结果图(img2)。
何为图与掩膜的与运算?
其实就是原图中的每个像素和掩膜中的每个对应像素进⾏与运算。
⽐如1 & 1 = 1;1 & 0 = 0;
⽐如⼀个3 * 3的图像与3 * 3的掩膜进⾏运算,得到的结果图像就是:
说⽩了,mask就是位图啊,来选择哪个像素允许拷贝,哪个像素不允许拷贝。
如果mask像素的值是⾮0的,我就拷贝它,否则不拷贝。
因为我们上⾯得到的mask中,感兴趣的区域是⽩⾊的,表明感兴趣区域的像素都是⾮0,⽽⾮感兴趣区域都是⿊⾊,表明那些区域的像素都是0。
⼀旦原图与mask图进⾏与运算后,得到的结果图只留下原始图感兴趣区域的图像了。
也正如下图所⽰。
image.copyTo(img2, mask);
下⾯两句代码所做的事情跟上⾯的差不多,⾸先将原始图image拷贝⼀份给img3,然后img3将mask⽩⾊区域设置为0(⿊⾊),好⽐如果mask中像素⾮0的,我就把我图像对应的那个点的像素值设置为0,否则啥也不做。
伪代码是if mask(i,j)>0 then img3(i,j)=0。
image.copyTo(img3);
img3.setTo(0, mask);
如果想要直接抠出⽬标区域,直接这样写就OK了:
img1 = image(r1);。