OpenCV学习5:掩膜mask操作

OpenCVmask的作用,如何制作掩模mask 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、mask是什么?二、OpenCV生成mask的几种方法总结 前言 OpenCV中的很多函数用到maskmask是什么?怎么作一个mask?将是本文的主要内容。 一、mask是什么? mask 不是马斯克,是掩膜,可以用来遮盖非感兴趣区,突出感兴趣区,使得图像处理只专注于ROI部分。 二、OpenCV生成mask的几种方法 注意:mask最终需要与要作用到的输入图像的尺寸与类型保持一致 方法一如下: #include. 阅读详情

什么是掩膜(mask)

定义:用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片、滤光片等。

数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:

  • 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。

  • 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。

  • 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。

  • 特殊形状图像的制作。

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

在OpenCV中,掩模操作是相对简单的。大致的意思是,通过一个掩模矩阵,重新计算图像中的每一个像素值。掩模矩阵控制了旧图像当前位置以及周围位置像素对新图像当前位置像素值的影响力度。用数学术语讲,即我们自定义一个权重表

 

掩膜操作之抠图

#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);////r1是设置好的感兴趣区域
    Mat img1, img2, img3, img4;
    image = imread("lol17.jpg");
    mask = Mat::zeros(image.size(), CV_8UC1);//第一步建立与原图一样大小的mask图像,并将所有像素初始化为0,因此全图成了一张全黑色图
    mask(r1).setTo(255);//第二步将mask图中的r1区域的所有像素值设置为255,也就是整个r1区域变成了白色。这样就能得到Mask图像了。
    img1 = image(r1);
    image.copyTo(img2, mask);//注意这句,原图(image)与掩膜(mask)进行与运算后得到了结果图(img2)

    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;
}

原始image图

mask图像

原图(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);

 

学到mask(r1)是代表mask图像中的r1部分

 

 

提高图像的对比度

矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask)也被称为 kernel。

通过掩膜操作实现图像对比度提高。

I(i,j) = 5*I(i,j) - [I(i-1,j) + I(i+1,j) + I(i,j-1) + I(i,j+1)]

Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,
                               -1,  5, -1,
                                0, -1,  0);

红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象

方法一是原始的

 

方法2:函数调用filter2D功能

  1. 定义掩膜:Mat kernel = (Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

filter2D( src, dst, src.depth(), kernel );其中srcdstMat类型变量、src.depth表示位图深度,有32248

 

 

 

第三章-OpenCV基础-4-掩模 掩模,又称为掩膜,掩码,模板。图像掩模是指,用特定的图像/图形/物体遮挡代处理的图像(全部或局部),从而控制图像处理的区域,在数字图像处理中,掩模就是一个指定的数组,毕竟,图像也是数组。左边图为原图,中间图为掩模(白色区域为透明区域,黑色区域为黑色遮挡区域),经过控制处理后,得到右边的结果图。 阅读详情

相关推荐

OpenCV之颜色空间转换、掩膜mask)、颜色提取——python实现

一、颜色空间转换 OpenCV有150中颜色空间转换方法,可以使用以下方式查看所有颜色空间转换方法 str.startswith()函数:用于判断一个字符串是否为某个字符串的开头。 dir()函数:带参数时,返回参数的属性、方法列表。 import cv2 flags = [i for i in dir(cv2) if i.startswith('COLOR_')] print(flags...

鬼刀 1万+

使用蒙版过滤图像——OpenCV实例

在图像处理中,有时需要对图像进行过滤或筛选操作,以获取特定区域的信息。然后,创建了一个大小与图像相同的零矩阵,并绘制了一个圆形的白色掩码,即将要保留的区域。最后,使用按位与(bitwise_and)操作将掩码应用于原始图像,并将结果显示出来。在运行该程序后,您会看到三个窗口:原始图像、掩码和过滤后的图像。原始图像是我们要处理的图像,掩码显示了我们要保留的区域,而过滤的图像则是仅包含该区域的图像。通过上述代码演示,您可以了解到OpenCV的按位操作的基本用法。使用蒙版过滤图像——OpenCV实例。

2301_79326930的博客 488

OpenCV掩膜处理

OpenCV中的mask操作具有几个意义,以下列出:①对兴趣区提取,用&amp;的概念,过滤掉其他区外图像,设定值为0。 ②屏蔽作用,与①类似操作。 ③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。 ④特殊形状图像的制作。个人觉得掩膜处理应用有两方面(可能现阶段水平就这个高度),一是兴趣区域提取,二是增强图像的对比度。下面主要就增强图像对比度进行说明。上图是掩膜的一...

lu_cuger的博客 2098

OpenCV掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

OpenCV掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

每一个不曾起舞的日子,都是对生命的辜负 6394

OpenCV掩膜(mask)图像的创建和使用

它通常是一个二维数组,与原始图像具有相同的尺寸,其上的每个像素值用来指示对应于原始图像中像素的处理方式。在后两种情况中,标量会首先被转换为与数组相匹配的类型,然后再进行运算。以下代码,可以在Source窗口中用鼠标左键点击选择点,这些点就是轮廓的顶点,在你点击的时候,会把点用线连起来,形成轮廓,然后点击右键开始创建掩膜。该函数能够填充复杂的区域,例如含有空洞的区域、自身相交的轮廓(它们的部分),等等。区域选择:在图像处理操作中,仅对掩模中标记为非零的区域应用滤镜、颜色调整或其他效果,而忽略零值区域。

jndingxin的专栏 6750

掩膜mask

掩膜mask) 1.掩膜mask)的定义 用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片,滤光片等。 掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过指定的数据值,数据范围,有限或无限值,感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模。 掩膜是一种图像滤镜的模板,实用掩膜经.

weixin_42258743的博客 2万+

OpenCV(8):掩膜MASK

其实就是原图中的每个像素和掩膜中的每个对应像素进行与运算。比如1 & 1 = 1;1 & 0 = 0;

2401_86889724的博客 1495

OpenCV掩膜操作(mask)实例

#include #include #include using namespace cv; using namespace std; void Sharpen(const Mat& myImage, Mat& Result) { CV_Assert(myImage.depth() == CV_8U); // accept only uchar images Resu

lichengyu的专栏 1万+

OpenCV学习笔记—掩膜mask的使用

掩膜mask的使用 首先介绍setTo()函数 /** @brief Sets all or some of the array elements to the specified value. This is an advanced variant of the Mat::operator=(const Scalar& s) operator. @param value Assigne...

shuke123321的博客 1567

OpenCv掩膜操作

掩膜操作主要是用来增加图像的对比度,在实现掩膜操作的时候需要掩膜mask也称为kernel),一般来讲掩膜都是奇数*奇数如3*3,5*5等。下面给出的是一个3*3的掩膜(图1)、掩膜的具体数值如图2所示和一个图像的部分像素值(图2)。                                                                                ...

qq_41480046的博客 4538

OpenCV+Cpp】day02图像的掩膜mask操作

本文分别介绍了使用传统手工和API对图像进行mask处理的方法

hiconsistent的博客 1367

opencv学习笔记(三)-- 矩阵的掩膜操作

矩阵的掩膜操作

milkhoko的博客 3142

opencv矩阵掩膜操作

前言 本文介绍opencv的矩阵掩膜操作。 一、图像的基本操作: 1、图像的基本运算有很多种,例如:+、-、、/、位运算、平方根、对数、绝对值等; 2、图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作; 3、各个颜色通道可以分别提取及对各个颜色通道进行各种运算操作(例如RGB有3种颜色通道,都可以进行运算)。 二、掩膜(Mask)是什么? 1、掩膜的组成:掩模是由0和1组成的一个二进制图像。 可简单理解为一个由0和1组成的矩阵。 2、掩膜的定义:用选定的图像、图形或物体,对

ivan_9的博客 2855

跟我一起学opencv 第二课之图像的掩膜操作

跟我一起学opencv 第二课之图像的掩膜操作 1.掩膜mask)概念 用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片,滤光片等。掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0...

weixin_30762087的博客 495

opencv -13 掩模

OpenCV中,掩模(mask)是一个与图像具有相同大小的二进制图像,用于指定哪些像素需要进行操作或被考虑。掩模通常用于选择特定区域或进行像素级别的过滤操作。计算结果=cv2.add(参数 1 , 参数 2 , 掩模)当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0。

小海聊智造 2119

OpenCV学习笔记11_Mask操作与图像叠加

一、掩膜操作Maskopencv功能: 1、 逻辑运算模板mask; 例如: inline //内联函数 void GpuMat::copyTo(OutputArray dst, InputArray mask) const { copyTo(dst, mask, Stream::Null()); } //copyTo函数 CV_WRAP void copyTo(OutputArray dst, InputArray mask, Stream& stream) const; /* S

qq_40595787的博客 3770

OpenCV图像处理:使用蒙版过滤图像

在本篇文章中,我们将探讨如何使用OpenCV库中的蒙版(mask)来过滤图像。蒙版是一个二进制图像,用于指定要保留或排除的图像区域。我们将通过一些示例代码来演示如何使用蒙版来实现图像过滤。过滤后的图像将显示出原始图像中蒙版区域的部分,并将其他区域设为黑色。函数将蒙版应用到原始图像上,生成过滤后的图像。这个函数将根据蒙版的像素值决定保留还是排除对应位置的原始图像像素。然后,我们创建一个与原始图像相同大小的空蒙版,通过。函数显示原始图像和过滤后的图像,并使用。在上面的代码中,我们首先使用。

SVIPCODE的博客 669

opencv学习记录——(12) 设置mask区域

mask图像和logo图像大小尺寸都一样,添加了mask后,只有mask的白色区域在logo中的相同区域能显示出来,即只有该区域才能粘贴在原图img上。二、mask区域是原logo取反二值化。下面是logo 原图。

qq_39648561的博客 1732
上一篇: OpenCV3.4.2+VS2015安装配置详细过程
下一篇: Apollo3.0安装及简单演示小结
蟹里夫司机
博客等级 码龄13年 160粉丝 11原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值