什么是掩膜(mask)
数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称做“掩模”),其做用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域之外的区域。
图像掩膜与其相似,用选定的图像、图形或物体,对处理的图像(所有或局部)进行遮挡,来控制图像处理的区域或处理过程。
光学图像处理中,掩模能够是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:css
①提取感兴趣区,用预先制做的感兴趣区掩模与待处理图像相乘,获得感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽做用,用掩模对图像上某些区域做屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区做处理或统计。
③结构特征提取,用类似性变量或图像匹配方法检测和提取图像中与掩模类似的结构特征。
④特殊形状图像的制做。html
掩膜是一种图像滤镜的模板,实用掩膜常常处理的是遥感图像。当提取道路或者河流,或者房屋时,经过一个n*n的矩阵来对图像进行像素过滤,而后将咱们须要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。ios
用选定的图像、图形或物体,对待处理的图像(所有或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模能够足胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:①提取感兴趣区,用预先制做的感兴趣区掩模与待处理图像相乘,获得感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。②屏蔽做用,用掩模对图像上某些区域做屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区做处理或统计。③结构特征提取,用类似性变量或图像匹配方法检测和提取图像中与掩模类似的结构特征。④特殊形状图像的制做。
'掩膜
数组
在OpenCV中咱们常常会遇到一个名字:Mask(掩膜)。不少函数都使用到它,那么这个Mask到底什么呢?markdown
一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对没法理解Mask到底有什么用。通过查阅大量资料后,也对Mask有一点本身的理解了,下面就说说个人理解。函数
好比我要对一幅图进行抠图操做,这就要用到Mask了,那我就以抠图为例,解释Mask在里面的做用。post
先上程序,再一句一句剖析。ui
该程序的功能就是抠出指定区域。spa
#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; }
原始图
3d
注意程序中的这两句关于Mask的操做。
mask = Mat::zeros(image.size(), CV_8UC1);
mask(r1).setTo(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);
转自:https://www.cnblogs.com/bithuaning/p/6925037.html