OpenCV探索之路(十三):详解掩膜mask

在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);
(0)

相关推荐

  • python+opencv图像处理(十四)

    图像直方图 1.灰度图像的直方图 灰度图像的直方图是灰度级和这种灰度级的概率之间关系的图形. 直接看图,下图中左侧是原图,右图为其直方图. 完整代码如下: import cv2 as cv impor ...

  • 好玩的OpenCV:图像操作的基本知识(2)

    1.1随机生成像素 生成与test.jpg相同大小图片,但是像素是随机生成的. import numpy as np import cv2raw_image = cv2.imread('test图片路 ...

  • 谈一谈|可见水印数据集生成技术

    引言为图片添加水印在生活中是一个十分常见的问题,有时候为了达到自己想要的效果,人们往往采用PS的方式.这种方式需要对图片进行P图处理,对于一些PS小白来说,P图的步骤太过于繁琐且容易造成视觉疲劳,因此 ...

  • 这个操作可能不值钱,但却值得学习 | 【图片批量裁剪】

    前言 有一句叫:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 这句话,在实际的应用中,让我体会很深,目前很多算法已经能到初步满足我们的需求,更多的时候是要花费大量的时间在处理数据上 ...

  • 【从零学习OpenCV 4】图像修复

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • Python+opencv 图像处理(五)

        灰度反转 "你说的黑是什么黑......"有一首歌的歌词是这样的. 在图像中,黑是什么? 很简单,就是0嘛. 因为在数字图像里,用0表示黑. 那么,"你说的白是什 ...

  • 好玩的OpenCV:图片操作的基本知识(1)

    图像基本知识 图像是由像素组成的,而像素实际上就是带有坐标位置和颜色信息的点.我们把图片想象成由若干行,若干列的点组成的, 现实中有RGB颜色系统,我们可以把图中任意一点(位置在第m行,第n列)的点A ...

  • python+opencv图像处理(十二)

    图像仿射变换和透视变换 天晴了...... 1.仿射变换 图像的仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形. 要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要 ...

  • 【OpenCV 4开发详解】直方图应用

    直方图不仅能够表示图像像素的统计特性,应用统计的直方图结果也可以增强图像的对比度,在图像中寻找相似区域等.本节中将重点介绍如果通过调整直方图分布提高图像的对比度.利用直方图反向投影寻找相同区域以及将图 ...

  • 【OpenCV 4开发详解】形态学应用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【OpenCV 4开发详解】图像腐蚀

     小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>. ...

  • 【OpenCV 4开发详解】图像连通域分析

    小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为 ...

  • 详解“十三鬼穴”(经典收藏)

    十三鬼穴出自唐代大医孙思邈(公元581-682年)着的<备急千金要方·卷十四·风癫第五>,其云:"扁鹊曰:百邪所病者,针有十三穴也,凡针之体,先从鬼宫起,次针鬼信,便至鬼垒,又至 ...

  • 十三征高句丽,历代征伐高句丽详解

    一征高句丽:在公元前195年,西汉的燕王卢绾北走匈奴后,其部将卫满带领旧部灭掉箕子朝鲜并建立了卫满朝鲜.公元前109年,卫满朝鲜右渠王发兵突袭辽东,汉武帝随即发兵5万,由楼船将军杨仆率领一支,从齐地渡 ...

  • 古代在云南建都的十三个国家详解

    云南地处中国西南边陲,东部与贵州.广西为邻,北部与四川省相连,西北部紧依西藏自治区,西部与缅甸接壤,南部和老挝.越南毗邻.全省地势呈现西北高.东南低,自北向南呈阶梯状逐级下降,属山地高原地形,以元江谷 ...

  • 古代在安阳建都的十三个国家详解

    安阳位于中国中北部.河南省最北部,地处河南.山西.河北三省交界处,东接濮阳,西临长治,南接鹤壁.新乡,北临邯郸.濮阳市下辖文峰区.北关区.殷都区.龙安区.安阳新区.开发区.林州市.安阳县.内黄县.汤阴 ...

  • 郑悟清太极十三势详解

    八 卦 掤进捋退自然理,阴阳水火相即济. 先知四手得来真,採挒肘靠方可许. 四隅从此演出来,十三势架永无已. 原 文 掤捋挤按世间稀,十个艺人十不知. 若能转灵并坚硬,沾连粘随俱无疑. 採挒肘靠更出奇 ...