iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Opencv图像处理之详解掩膜mask
  • 954
分享到

Opencv图像处理之详解掩膜mask

2024-04-02 19:04:59 954人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

1.在OpenCV中我们经常会遇到一个名字:Mask(掩膜)。很多函数都使用到它,那么这个Mask到底什么呢? 2.如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,

1.在OpenCV中我们经常会遇到一个名字:Mask(掩膜)。很多函数都使用到它,那么这个Mask到底什么呢?

2.如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢?
答案是,使用掩膜(masking)。
我们先看一下掩膜的基础。图像的位运算。

图像基本运算

图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、对数、绝对值等;图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作,各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操作。总之,对于图像可以进行的基本运算非常的多,只是挑了些常用的操作详解。


bitwise_and、bitwise_or、bitwise_xor、bitwise_not这四个按位操作函数。
void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 & src2
void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 | src2
void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 ^ src2
void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray()); //dst = ~src

上述的基本操作中都属于将基础数学运算应用于图像像素的处理中,下面将着重介绍

bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1

为了便于大家进一步理解,下面给出测试代码:


# opencv 图像的基本运算
 
# 导入库
import numpy as np
import argparse
import cv2
 
# 构建参数解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
 
# 加载图像
image = cv2.imread(args["image"])
cv2.imshow("image loaded", image)
 
# 创建矩形区域,填充白色255
rectangle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1) # 修改这里
cv2.imshow("Rectangle", rectangle)
 
# 创建圆形区域,填充白色255
circle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.circle(circle, (150, 150), 150, 255, -1) # 修改
cv2.imshow("Circle", circle)
 
 
# 在此例(二值图像)中,以下的0表示黑色像素值0, 1表示白色像素值255
# 位与运算,与常识相同,有0则为0, 均无0则为1
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)
cv2.waiTKEy(0)
 
 
 
# 非运算,非0为1, 非1为0
bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT", bitwiseNot)
cv2.waitKey(0)
 
# 或运算,有1则为1, 全为0则为0
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)
 
# 异或运算,不同为1, 相同为0
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)
cv2.waitKey(0)
 
 

可以看到,原图是一张星空夜景图。

效果如下:




为了便于展示,后面我只截取部分区域效果:



掩膜(mask)

在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:
数字图像处理中的掩膜的概念是借鉴于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。

数字图像处理中,掩模为二维矩阵数组,有时也用多值图像,图像掩模主要用于:
①提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
②屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。

在所有图像基本运算的操作函数中,凡是带有掩膜(mask)的处理函数,其掩膜都参与运算(输入图像运算完之后再与掩膜图像或矩阵运算)。

掩膜实例

如开篇所提问题2,要对一幅图进行抠图(裁剪)操作,这就要用到Mask了,那么就以抠图为例,解释Mask在里面的作用。同样以上图为例,从原图中裁剪小树。

我们利用OR结果(其他结果也行),修改调整后,

代码如下:


# opencv 图像的基本运算
 
# 导入库
import numpy as np
import argparse
import cv2
 
# 构建参数解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
 
# 加载图像
image = cv2.imread(args["image"])
cv2.imshow("image loaded", image)
 
# 创建矩形区域,填充白色255
rectangle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.rectangle(rectangle, (360, 348), (660, 570), 255, -1) # 修改这里
cv2.imshow("Rectangle", rectangle)
 
# 创建圆形区域,填充白色255
circle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.circle(circle, (520, 455), 140, 255, -1) # 修改
cv2.imshow("Circle", circle)
 
''' 
# 在此例(二值图像)中,以下的0表示黑色像素值0, 1表示白色像素值255
# 位与运算,与常识相同,有0则为0, 均无0则为1
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)
cv2.waitKey(0)
# 非运算,非0为1, 非1为0
bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT", bitwiseNot)
cv2.waitKey(0)
# 异或运算,不同为1, 相同为0
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)
cv2.waitKey(0)
'''
# 或运算,有1则为1, 全为0则为0
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)
# 使用mask
mask = bitwiseOr
cv2.imshow("Mask", mask)
 
# Apply out mask -- notice how only the person in the image is cropped out
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask Applied to Image", masked)
cv2.waitKey(0)

结果展示:




简单说就是:

与或非异或运算与我们的常识类似。掩膜操作就是两幅图像(numpy数组)的位运算操作。

附录:c++


#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);

如果想要直接抠出目标区域,直接这样写就OK了:


img1 = image(r1);

参考文献:

1.https://www.cnblogs.com/skyfsm/p/6894685.html

到此这篇关于Opencv图像处理之详解掩膜mask的文章就介绍到这了,更多相关Opencv 掩膜内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Opencv图像处理之详解掩膜mask

本文链接: https://www.lsjlt.com/news/122083.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Opencv图像处理之详解掩膜mask
    1.在OpenCV中我们经常会遇到一个名字:Mask(掩膜)。很多函数都使用到它,那么这个Mask到底什么呢? 2.如果我们想要裁剪图像中任意形状的区域时,应该怎么办呢? 答案是,...
    99+
    2024-04-02
  • OpenCV制作Mask图像掩码的案例
    目录一、掩膜(mask)二、案例1.效果图2. 源码一、掩膜(mask) 在有些图像处理的函数中有的参数里面会有mask参数,即此函数支持掩膜操作,首先何为掩膜以及有什么用,如下:数...
    99+
    2023-02-16
    OpenCV Mask图像掩码 Mask掩码 OpenCV Mask掩码
  • Python图像运算之图像掩膜直方图和HS直方图详解
    目录一.图像掩膜直方图二.图像HS直方图三.直方图判断白天黑夜四.总结一.图像掩膜直方图 如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算。假设将要统计的部分设置为白...
    99+
    2024-04-02
  • OpenCV图像处理之图像拼接详解
    目录图像拼接技术一、需求分析二、具体步骤三、代码实现图像拼接技术 一、需求分析 将下面两张图像进行拼接 拼接得到一张完整的图像 二、具体步骤 1.选择特征点 //1、选...
    99+
    2022-11-13
    OpenCV 图像处理 图像拼接 OpenCV 图像拼接 OpenCV 图像处理
  • 超详细注释之OpenCV制作图像Mask
    这篇博客将介绍如何使用OpenCV制作Mask图像掩码。使用位运算和图像掩码允许我们只关注图像中感兴趣的部分,截取出任意区域的ROIs。 应用: 图像感兴趣区域的截取; 图像融合:构...
    99+
    2024-04-02
  • Opencv图像处理中如何使用mask
    这篇文章将为大家详细讲解有关Opencv图像处理中如何使用mask,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图像基本运算图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、...
    99+
    2023-06-14
  • OpenCV数字图像处理基于C++之图像形态学处理详解
    目录1、图像腐蚀1.1 CV腐蚀函数1.2 自定义腐蚀函数1.3 对比2、图像膨胀2.1 CV膨胀函数2.2 自定义膨胀函数2.3 对比3、开运算3.1 方法一3.2 方法二4、闭运...
    99+
    2022-12-08
    数字图像处理 opencv 基于opencv的图像处理 opencv c++入门
  • OpenCV图像处理之直方图比较方法详解
    目录一、直方图比较二、图像直方图比较方法三、代码实现四、图像处理效果一、直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算...
    99+
    2024-04-02
  • Java OpenCV图像处理之SIFT角点检测详解
    目录介绍示例代码效果图补充介绍 在某些情况下对图像进行缩放后,角点信息可能会丢失,这时候Harri便不能检测到所有的角点。SIFT(scale-invariant feature t...
    99+
    2024-04-02
  • opencv-python基本图像处理详解
    目录一、使用matplotlib显示图1、显示热量图 2、显示灰度图二、使用cv.imread显示图像1、显示灰度图像总结一、使用matplotlib显示图 impor...
    99+
    2024-04-02
  • OpenCV图像处理GUI功能详解
    目录一、图像入门1.读取图像2.显示图像3.保存图像二、视频入门1.用相机捕捉视频2.播放视频文件3.保存视频总结OpenCV图像处理 一、图像入门 1.读取图像 使用 cv.im...
    99+
    2024-04-02
  • Python图像处理之图像量化处理详解
    目录一.图像量化处理原理二.图像量化实现三.图像量化等级对比四.K-Means聚类实现量化处理五.总结一.图像量化处理原理 量化(Quantization)旨在将图像像素点对应亮度的...
    99+
    2024-04-02
  • Python+OpenCV之图像轮廓详解
    目录1. 图像轮廓1.1 findContours介绍1.2 绘制轮廓1.3 轮廓特征2. 轮廓近似2.1 轮廓2.2 边界矩形2.3 外界多边形及面积1. 图像轮廓 1.1 fin...
    99+
    2024-04-02
  • Python+OpenCV之图像梯度详解
    目录1. Sobel算子1.1 Sobel介绍1.2 横向Sobel算子1.3 纵向Sobel算子1.4 合并横纵向的方法提取更好的边缘的结果1.5 利用1.3方法绘制素描风格2. ...
    99+
    2024-04-02
  • Python+OpenCV图像处理之直方图统计
    目录1. 直方图概述(1)基本概念(2)直方图中的术语2. 直方图绘制(1)读取图像信息(2)绘制直方图3. 掩膜直方图(1)基本概念(2)实现代码4. H-S 直方图(1)基本概念...
    99+
    2024-04-02
  • Python图像处理之图像金字塔详解
    目录一.图像金字塔原理二.图像向上取样三.图像向下取样四.总结一.图像金字塔原理 上一篇文章讲解的图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和...
    99+
    2024-04-02
  • Python基于OpenCV的视频图像处理详解
    目录初识OpenCV视频读写处理运动轨迹标记运动检测运动方向检测初识OpenCV OpenCV是一个开源的,跨平台的计算机视觉库,它采用优化的C/C++代码编写,能够充分利用多核处理...
    99+
    2023-02-02
    Python OpenCV视频图像处理 Python 视频图像处理 Python OpenCV 图像处理
  • PythonOpenCV图像处理之图像滤波特效详解
    目录1 分类2 邻域滤波2.1 线性滤波2.2 非线性滤波3 频域滤波3.1 低通滤波3.2 高通滤波1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domai...
    99+
    2024-04-02
  • Python图像处理之图像增广算法详解
    目录前言图像增广算法a.图像旋转b.图像亮度调整c.图像裁剪及拼接本章小结前言 图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起,大规模数据集的需求变得更加迫切,...
    99+
    2023-05-20
    Python图像增广算法 Python图像处理 Python 算法
  • OpenCV图像缩放之cv.resize()函数详解
    目录系列前言API函数详解参数列表缩放方式其一缩放方式其二两种方式的优先级关于插值方式扩展 —— 相关函数总结系列前言 这个系列是我第一个想要更下去的系列。每...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作