OpenCV:掩膜操作mask
1、先看一个示例:
对图像中的指定区域提取;
代码如下:
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\core\core.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image, mask;
Rect r1(172, 60, 74, 214);//感兴趣区域
image = imread("1.jpg");
mask = Mat::zeros(image.size(), CV_8UC1);
mask(r1).setTo(255);//二值图
Mat img1, img2, img3, img4;
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;
}
结果如下如所示:

2、解释:
在程序中这两句关于mask的操作:
mask=Mat::zeros(image.size(),CV_8UC1);
mask(r1).setTo(255);//r1是设置好的感兴趣区域
首先建立一幅大小和原图一样的mask图像,其像素初始为0;即全黑图像;
然后将mask图像中的r1区域所有像素设置为255;
如下图所示:

3、image.copyTo(img2,mask);
表示将原图像拷贝到img2上,
mask掩膜的作用是仅允许原图像固定区域的像素执行拷贝操作;
结果如图所示:

4、mask掩膜的实质:
原图image与掩膜mask进行与运输得到了结果图image;
何为图与掩膜的与运算?
其实就是图像中每个像素和掩膜中每个对应像素进行与运行;
如:1 & 1 = 1;1 & 0 = 0;
又如:一个3 * 3的图像与3 * 3的掩膜进行运算,
如下所示:

5、mask意义:
mask位图,来选择哪个像素允许拷贝,哪个像素不允许拷贝。
如果mask像素的值是非0的,我就拷贝它,否则不拷贝。
因为我们上面得到的mask中,感兴趣的区域是白色的,
表明感兴趣区域的像素都是非0,而非感兴趣区域都是黑色,表明那些区域的像素都是0。一旦原图与mask图进行与运算后,得到的结果图只留下原始图感兴趣区域的图像了。
也正如下图所示。

6、总结:
①mask掩膜,来选择哪个像素允许拷贝,哪个像素不允许拷贝;
②如果mask像素的值是非0的,就允许操作,否则不允许操作;
③掩膜运算:其实就是图像中每个像素和掩膜中每个对应像素进行与运行;
