OpenCV:mask的作用,如何制作掩模mask

本文介绍了OpenCV中mask的基本概念,如何使用矩形和圆形生成mask,并展示了如何利用mask对图像ROI进行选择性处理。通过实例演示了mask的创建、ROI设置和不同形状的应用,适合图像处理初学者和开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

OpenCV中的很多函数用到mask,mask是什么?怎么作一个mask?将是本文的主要内容。


一、mask是什么?

mask 不是马斯克,是掩膜,可以用来遮盖非感兴趣区,突出感兴趣区,使得图像处理只专注于ROI部分。

二、OpenCV生成mask的几种方法

注意:mask最终需要与要作用到的输入图像的尺寸与类型保持一致

矩形

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
  Mat src = imread("img1.png", IMREAD_GRAYSCALE);
  imshow("src", src);
  // 定义mask,大小640*480,像素全0
  Mat mask = cv::Mat::zeros(Size(640, 480), CV_8UC1);

  // 作一个从坐标(220,120),宽200,高200的矩形框,框内填充白色,从方法1,2,3中任选一
  // 方法1
  rectangle(mask, cv::Rect(220, 120, 200, 200), Scalar(255), -1);
  // 方法2
  mask(cv::Rect(320, 50, 240, 310)) = 255;
  // 方法3
  mask(cv::Rect(320, 50, 240, 310)).setTo(255);
  
  Mat dst;
  // 将src中对应对应掩膜ROI中区域拷贝到dst
  src.copyTo(dst, mask);
  
  imshow("mask",mask);
  imshow("dst", dst);
  waitKey();
  
  return 0;
}

运行结果如下:

正在打开图片,请稍等

src

正在打开图片,请稍等
mask

正在打开图片,请稍等

dst

圆形

同理

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
  Mat src = imread("img1.png", IMREAD_GRAYSCALE);
  
  // 定义mask,大小640*480,像素全0
  Mat mask = cv::Mat::zeros(Size(640, 480), CV_8UC1);
  // 作一个以点坐标(320,50)为圆心,150为半径的圆,圆内填充白色
  circle(mask, Point(440, 205), 150, Scalar(255),-1);
  
  Mat dst;
  // 将src中对应对应掩膜ROI中区域拷贝到dst
  src.copyTo(dst, mask);
  
  imshow("mask",mask);
  imshow("dst", dst);
  waitKey();
  
  return 0;
}

正在打开图片,请稍等

mask

正在打开图片,请稍等

dst

mask可以是各种形状,各式各样,方法也有很多,这里只略举一二。


总结

定义mask,设置ROI,将ROI内部填充白色,其他填充黑色,即可对ROI区域操作,遮盖其他区域。也可以将mask反转,遮盖矩形框内数据,处理框外数据。

OpenCV 中,掩膜图像相减可以通过简单的像素级操作实现。具体来说,可以利用 `cv2.subtract` 函数完成这一任务。以下是详细的说明以及代码示例: ### 掩膜图像相减的概念 掩膜图像相减指的是对两个相同大小的掩膜图像执行逐像素差值计算。对于每一对对应的像素点 \(p_{mask1}(x,y)\) 和 \(p_{mask2}(x,y)\),结果图像上的该位置像素值为两者之间的绝对差值或简单差值。 此过程通常用于检测两张图像间的差异区域或者分析特定条件下的变化情况[^5]。 ### 实现方法 通过调用 OpenCV 库中的 subtract 方法可以直接得到两幅灰度图之间按位相减的结果;如果希望获得更直观的变化效果,则可能还需要进一步处理比如二值化等步骤来突出显示这些不同之处。 下面给出一段 Python 示例程序展示如何使用 OpenCV 执行这样的操作: ```python import cv2 import numpy as np # 创建第一个掩模(白色矩形) mask1 = np.zeros((300, 300), dtype="uint8") cv2.rectangle(mask1, (50, 50), (200, 200), 255, -1) # 创建第二个掩模(黑色圆形覆盖部分白矩形) mask2 = mask1.copy() cv2.circle(mask2, (150, 150), 75, 0, -1) # 计算掩码相减 result_mask = cv2.subtract(mask1, mask2) # 展示结果 cv2.imshow("Mask 1", mask1) cv2.imshow("Mask 2", mask2) cv2.imshow("Result Mask", result_mask) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上脚本首先定义了一个全黑背景上有白色正方形图案的第一张掩模 (`mask1`) ,接着复制它并在此基础上画上一个填充式的圆圈作为第二张掩模(`mask2`) 。最后运用 `cv2.subtract()` 来求得它们彼此间数值上的区别形成新的结果掩模(`result_mask`) 并予以呈现出来[^5]。 ### 注意事项 当涉及到色彩空间转换或者其他复杂场景时,请确保输入数据符合预期格式,并适当调整参数设置以达到最佳视觉表现[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fshinech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值