当前位置: 首页 > article >正文

【图像处理】——掩码

一、掩码的定义与本质

掩码是一种与原始数据(通常是图像或矩阵)具有相同形状的数组或矩阵,其元素用于控制对原始数据的操作。它本质上是一种筛选或过滤机制,通过对原始数据的每个元素与掩码中相应元素的组合操作,来决定该元素是否被保留、修改或丢弃。

二、掩码的类型及特点

二值掩码(Binary Mask)

  • 特点
    • 仅包含两种元素值,通常是 0 和 1 或 0 和 255。
    • 元素值 0 表示对应位置的原始数据将被屏蔽或排除,而元素值 1 或 255 表示对应位置的原始数据将被保留或选中。
  • 应用场景
    • 对象提取: 当需要从复杂的图像中提取出感兴趣的对象时,可通过各种图像分割算法(如基于阈值的分割、基于边缘的分割、基于区域的分割等)生成二值掩码。 上述代码使用 cv2.threshold 函数将图像根据 127 的阈值转换为二值图像,然后使用 cv2.bitwise_and 函数将原始图像与自身按位与,使用生成的二值掩码提取出对象。

      import cv2
      import numpy as np
      
      # 读取图像
      image = cv2.imread('example_image.jpg', cv2.IMREAD_GRAYSCALE)
      # 设定阈值,将图像二值化
      _, binary_mask = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
      # 提取对象
      extracted_object = cv2.bitwise_and(image, image, mask=binary_mask)
    • 区域屏蔽: 可用于屏蔽图像中不需要的部分,只保留感兴趣的区域。 这里使用 cv2.rectangle 在零矩阵上创建一个矩形区域的二值掩码,再通过 cv2.bitwise_and 屏蔽掉矩形区域外的部分。

      import cv2
      import numpy as np
      
      image = cv2.imread('example_image.jpg')
      height, width, _ = image.shape
      # 创建矩形区域的二值掩码
      binary_mask = np.zeros((height, width), dtype=np.uint8)
      cv2.rectangle(binary_mask, (100, 100), (300, 300), 255, -1)
      # 屏蔽除矩形区域外的部分
      masked_image = cv2.bitwise_and(image, image, mask=binary_mask)

灰度掩码(Grayscale Mask)

  • 特点
    • 元素值在 0 到 255 之间。
    • 元素值的大小表示对原始数据的操作程度,例如作为权重,可实现更平滑的过渡效果。
  • 应用场景
    • 图像融合: 当需要将两张图像无缝融合时,灰度掩码可作为权重图。 此代码中,使用 np.linspace 创建一个水平方向的线性渐变灰度掩码,将其扩展到三个通道,作为权重对两张图像进行融合。

      import cv2
      import numpy as np
      
      image1 = cv2.imread('image1.jpg')
      image2 = cv2.imread('image2.jpg')
      # 确保图像大小相同
      if image1.shape == image2.shape:
          height, width, _ = image1.shape
          # 创建一个简单的线性渐变的灰度掩码
          grayscale_mask = np.tile(np.linspace(0, 1, width).reshape(1, width), (height, 1))
          grayscale_mask = np.dstack((grayscale_mask, grayscale_mask, grayscale_mask)).astype(np.float32)
          # 图像融合
          blended_image = image1.astype(np.float32) * (1 - grayscale_mask) + image2.astype(np.float32) * grayscale_mask
          blended_image = blended_image.astype(np.uint8)
    • 图像调整: 可用于局部图像增强或减弱。 这里创建了一个中心亮四周暗的圆形灰度掩码,使用 cv2.GaussianBlur 使其平滑,然后用于增强图像中心区域。

      import cv2
      import numpy as np
      
      image = cv2.imread('example_image.jpg')
      # 创建一个中间亮四周暗的灰度掩码
      height, width, _ = image.shape
      center_x, center_y = width // 2, height // 2
      grayscale_mask = np.zeros((height, width), dtype=np.float32)
      cv2.circle(grayscale_mask, (center_x, center_y), min(center_x, center_y), 1, -1, cv2.LINE_AA)
      grayscale_mask = cv2.GaussianBlur(grayscale_mask, (15, 15), 0)
      # 增强图像中心区域
      enhanced_image = (image.astype(np.float32) * grayscale_mask).astype(np.uint8)

频率域掩码(Frequency Domain Mask)

  • 特点
    • 通常在对图像进行傅里叶变换后使用,通过修改频率域中的幅值信息,对图像进行频域滤波。
  • 应用场景
    • 图像滤波: 可实现高通、低通、带通、带阻等滤波效果。 上述代码首先将图像进行傅里叶变换并将零频分量移到中心,然后创建一个低通滤波器的圆形掩码,应用该掩码后再进行逆傅里叶变换得到滤波后的图像。

      import cv2
      import numpy as np
      import numpy.fft.fft2 as fft2
      import numpy.fft.ifft2 as ifft2
      import numpy.fft.fftshift as fftshift
      import numpy.fft.ifftshift as ifftshift
      
      image = cv2.imread('example_image.jpg', cv2.IMREAD_GRAYSCALE)
      # 傅里叶变换
      f = fft2(image)
      fshift = fftshift(f)
      rows, cols = image.shape
      crow, ccol = rows // 2, cols // 2
      # 低通滤波器掩码,截止频率为 30
      low_pass_mask = np.zeros((rows, cols), np.uint8)
      cv2.circle(low_pass_mask, (ccol, crow), 30, 1, -1)
      # 应用掩码
      fshift_filtered = fshift * low_pass_mask
      f_ishift = ifftshift(fshift_filtered)
      filtered_image = np.real(ifft2(f_ishift))
      filtered_image = np.uint8(filtered_image)

三、掩码的实现细节

创建掩码

可使用各种图像处理库(如 OpenCV、NumPy)的函数创建不同形状和特性的掩码。 例如,使用 cv2.circlecv2.rectangle 等创建二值形状掩码,使用 np.linspacenp.tile 等创建灰度渐变掩码。

应用掩码

  • 按位运算(针对二值掩码): 使用 cv2.bitwise_andcv2.bitwise_orcv2.bitwise_xor 等函数将二值掩码应用于图像,进行图像的提取、屏蔽、反转等操作。
  • 乘法运算(针对灰度掩码): 对于灰度掩码,可将原始图像和掩码进行元素级乘法操作,注意数据类型的匹配和转换,确保结果在合理范围。
  • 频域操作(针对频率域掩码): 先将图像进行傅里叶变换,应用频率域掩码后再进行逆傅里叶变换。使用 numpy.fft.fft2numpy.fft.ifft2 等函数进行变换,使用 numpy.fft.fftshiftnumpy.fft.ifftshift 进行零频分量的移位操作。

四、掩码的优势与注意事项

  • 优势
    • 灵活性:可以根据不同的需求创建各种形状和特性的掩码,实现复杂的图像处理操作。
    • 可扩展性:能够与其他图像处理技术结合,实现更高级的功能,如结合形态学操作、特征提取等。
  • 注意事项
    • 数据类型:在操作过程中,要注意原始数据和掩码的数据类型,确保操作的有效性和结果的正确性。
    • 尺寸匹配:掩码的尺寸必须与原始数据的尺寸严格匹配,否则会导致错误。

掩码在图像处理和计算机视觉中是一种强大的工具,通过不同类型的掩码可以实现多种复杂的操作,从简单的区域提取和屏蔽到复杂的频域滤波和图像融合,为实现各种图像处理任务提供了灵活且高效的方法。在实际应用中,需要根据具体任务选择合适的掩码类型和实现方法,并注意操作中的数据类型和尺寸匹配等细节。

五、参考文献

参考论文地址:

1703.06870v3

项目地址:

facebookresearch/Detectron: FAIR's research platform for object detection research, implementing popular algorithms like Mask R-CNN and RetinaNet.


http://www.kler.cn/a/513975.html

相关文章:

  • 55.【5】BUUCTF WEB NCTF2019 sqli
  • 工业相机 SDK 二次开发-Halcon 插件
  • 【机器学习实战中阶】比特币价格预测
  • HDFS的Java API操作
  • HTML之拜年/跨年APP(改进版)
  • mac m1下载maven安装并配置环境变量
  • C#防止重复提交
  • Unity中两个UGUI物体的锚点和中心点设置成不一样的,然后怎么使两个物体的位置一样?
  • vsftpd虚拟用户部署
  • MATLAB中characterListPattern函数用法
  • 【爱上C++】vector用法详解
  • 案例分析一
  • MySQL新建和删除普通用户
  • Mac苹果电脑 怎么用word文档和Excel表格?
  • 如何使用Python爬虫获取微店商品详情:代码示例与实践指南
  • 《C++ primer plus》第六版课后编程题-第04章
  • 【王树森搜素引擎技术】概要03:搜索引擎的评价指标
  • 【ESP32】ESP32连接JY61P并通过WIFI发送给电脑
  • 软件测试 —— Postman(全局变量和环境变量,请求前置脚本,关联)
  • android studio 工具.gradle目录修改
  • 【Go语言圣经】第三节:基础数据类型
  • No. 34 笔记 | Python知识架构与数据类型相关内容 | 实操
  • postgresql清理wal日志
  • k8s的CICD实施项目
  • 基于微信小程序的民宿预订管理系统
  • map和set的使用(一)详解