OpenCV4入门系列教程20:图像掩膜mask

索引地址:系列教程索引地址

上一篇:OpenCV4入门系列教程19:图像的数学操作bitwise(和差积)

掩膜(mask)

在上一篇文章中,部分函数中有mask这个带有默认参数值的参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:

用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。

数字图像处理中,图像掩模主要用于:

  • 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
  • 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
  • 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
  • 特殊形状图像的制作。

掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像。当提取道路或者河流,或者房屋时,通过一个nnn * n的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。

矩阵运算

以图和掩膜的与运算为例:

原图中的每个像素和掩膜中的每个对应像素进行与运算。比如1 & 1 = 1;1 & 0 = 0;
比如一个3 * 3的图像与3 * 3的掩膜进行运算,得到的结果图像就是:

mask

简单来说,掩膜就是两幅图像之间进行的各种位运算操作。

图像掩膜

先创建掩膜,然后原图与掩膜进行运算,得到结果。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "opencv2/opencv.hpp"

using namespace cv;

int main() {
Mat image, mask;
Rect r1(100, 100, 250, 300); //区域
Mat img1, img2, img3, img4;
image = imread("lena.jpg"); //加载原图
mask = Mat::zeros(image.size(), CV_8UC1); //创建全为0的掩膜对象
mask(r1).setTo(255); //将全黑的掩膜对象中的r1部分设为白色
img1 = image(r1); //取出lena途中r1位置的图
image.copyTo(img2, mask); //lena与掩膜进行与运算,结果给img2

image.copyTo(img3); //lena复制到img3
img3.setTo(0, mask);//将img3中对应mask中不为0的值设置为0

imshow("original", image);
imshow("img1", img1);
imshow("img2", img2);
imshow("img3", img3);
imshow("mask", mask);

waitKey(0);
return 0;
}

测试效果:

mask

下一篇:OpenCV4入门系列教程21:滑动栏