OpenCV:掩膜操作mask

2025-10-16 09:39:09

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;

}

结果如下如所示:

OpenCV:掩膜操作mask

2、解释:

在程序中这两句关于mask的操作:

mask=Mat::zeros(image.size(),CV_8UC1);

mask(r1).setTo(255);//r1是设置好的感兴趣区域

首先建立一幅大小和原图一样的mask图像,其像素初始为0;即全黑图像;

然后将mask图像中的r1区域所有像素设置为255;

如下图所示:

OpenCV:掩膜操作mask

3、image.copyTo(img2,mask);

表示将原图像拷贝到img2上,

mask掩膜的作用是仅允许原图像固定区域的像素执行拷贝操作;

结果如图所示:

OpenCV:掩膜操作mask

4、mask掩膜的实质:

原图image与掩膜mask进行与运输得到了结果图image;

何为图与掩膜的与运算?

其实就是图像中每个像素和掩膜中每个对应像素进行与运行;

如:1 & 1 = 1;1 & 0 = 0;

又如:一个3 * 3的图像与3 * 3的掩膜进行运算,

如下所示:

OpenCV:掩膜操作mask

5、mask意义:

mask位图,来选择哪个像素允许拷贝,哪个像素不允许拷贝。

如果mask像素的值是非0的,我就拷贝它,否则不拷贝。

因为我们上面得到的mask中,感兴趣的区域是白色的,

表明感兴趣区域的像素都是非0,而非感兴趣区域都是黑色,表明那些区域的像素都是0。一旦原图与mask图进行与运算后,得到的结果图只留下原始图感兴趣区域的图像了。

也正如下图所示。

OpenCV:掩膜操作mask

6、总结:

①mask掩膜,来选择哪个像素允许拷贝,哪个像素不允许拷贝;

②如果mask像素的值是非0的,就允许操作,否则不允许操作;

③掩膜运算:其实就是图像中每个像素和掩膜中每个对应像素进行与运行;

OpenCV:掩膜操作mask

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢