【OpenCV】Python图像处理之掩膜

OpenCV-Python 中的掩膜(Mask)是一种与图像尺寸相同的二值图像(通常为单通道,像素值为 0 或 255),用于控制图像处理的区域 ------ 仅对掩膜中非零区域(白色)进行操作,零区域(黑色)保持不变。掩膜广泛应用于图像分割、区域提取、滤波、合成等场景,以下详细介绍掩膜的创建、使用及典型应用:

一、掩膜的基本概念

  • 掩膜本质 :二值图像(uint8类型),非零值表示 "有效区域",零值表示 "无效区域";
  • 核心作用:限制操作范围,仅处理掩膜覆盖的区域;
  • 尺寸要求:需与原图像的高度、宽度完全一致(通道数通常为 1)。

二、掩膜的创建

1. 手动创建(NumPy)

通过 NumPy 数组直接生成掩膜:

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 创建与图像尺寸匹配的黑色掩膜(全0)
img = cv2.imread('image.jpg')
mask = np.zeros(img.shape[:2], dtype=np.uint8)  # 单通道,尺寸与图像相同

# 在掩膜上绘制白色区域(有效区域)
mask[50:200, 100:300] = 255  # 矩形区域设为白色
mask = cv2.circle(mask, (img.shape[1]//2, img.shape[0]//2), 80, 255, -1)  # 圆形区域设为白色
2. 通过图像阈值生成掩膜

从灰度图像中通过阈值分割创建掩膜:

python 复制代码
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化生成掩膜(亮度>127的区域设为白色)
_, mask = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
3. 通过轮廓检测生成掩膜

基于图像轮廓创建自定义形状的掩膜:

python 复制代码
# 检测图像轮廓
contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建掩膜并填充轮廓区域
mask = np.zeros_like(gray)
cv2.drawContours(mask, contours, -1, 255, -1)  # 填充所有轮廓为白色

三、掩膜的典型应用

1. 掩膜区域提取(cv2.bitwise_and

提取图像中掩膜覆盖的区域,其余区域设为黑色:

python 复制代码
# 提取掩膜区域的图像
masked_img = cv2.bitwise_and(img, img, mask=mask)

# 显示结果
plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(132), plt.imshow(mask, cmap='gray'), plt.title('Mask')
plt.subplot(133), plt.imshow(cv2.cvtColor(masked_img, cv2.COLOR_BGR2RGB)), plt.title('Masked Image')
plt.show()
2. 掩膜滤波(仅滤波指定区域)

对图像的特定区域进行滤波,其余区域保持原样:

python 复制代码
# 创建模糊图像
blurred = cv2.GaussianBlur(img, (21, 21), 0)
# 仅对掩膜区域应用模糊,其余区域保留原图
masked_blur = np.where(mask[:, :, np.newaxis], blurred, img)  # 扩展掩膜维度匹配图像
masked_blur = masked_blur.astype(np.uint8)
3. 图像合成(掩膜叠加)

将一幅图像的指定区域叠加到另一幅图像:

python 复制代码
# 读取背景和前景图像
bg = cv2.imread('background.jpg')
fg = cv2.imread('foreground.jpg')
fg = cv2.resize(fg, (bg.shape[1], bg.shape[0]))

# 创建前景掩膜(例如提取前景的白色区域)
fg_gray = cv2.cvtColor(fg, cv2.COLOR_BGR2GRAY)
_, fg_mask = cv2.threshold(fg_gray, 240, 255, cv2.THRESH_BINARY)
fg_mask_inv = cv2.bitwise_not(fg_mask)  # 反掩膜

# 提取背景的非前景区域和前景的前景区域
bg_part = cv2.bitwise_and(bg, bg, mask=fg_mask_inv)
fg_part = cv2.bitwise_and(fg, fg, mask=fg_mask)

# 合成图像
result = cv2.add(bg_part, fg_part)
4. 掩膜直方图计算

仅计算掩膜区域的颜色直方图:

python 复制代码
# 计算掩膜区域的BGR直方图
hist_b = cv2.calcHist([img], [0], mask, [256], [0, 256])
hist_g = cv2.calcHist([img], [1], mask, [256], [0, 256])
hist_r = cv2.calcHist([img], [2], mask, [256], [0, 256])

# 绘制直方图
plt.plot(hist_b, color='blue'), plt.plot(hist_g, color='green'), plt.plot(hist_r, color='red')
plt.title('Masked Histogram'), plt.xlabel('Pixel Value'), plt.ylabel('Frequency')
plt.show()
5. 掩膜形态学操作

对掩膜本身进行膨胀、腐蚀等操作,调整有效区域形状:

python 复制代码
# 膨胀掩膜(扩大有效区域)
kernel = np.ones((5, 5), np.uint8)
mask_dilated = cv2.dilate(mask, kernel, iterations=2)

# 腐蚀掩膜(缩小有效区域)
mask_eroded = cv2.erode(mask, kernel, iterations=1)

四、掩膜的高级应用:Alpha 通道掩膜

对于带透明通道(RGBA)的图像,Alpha 通道可直接作为掩膜:

python 复制代码
# 读取带Alpha通道的PNG图像
rgba_img = cv2.imread('transparent.png', cv2.IMREAD_UNCHANGED)
rgb_img = rgba_img[:, :, :3]  # 彩色通道
alpha_mask = rgba_img[:, :, 3]  # Alpha通道作为掩膜

# 提取透明区域外的图像
masked_rgba = cv2.bitwise_and(rgb_img, rgb_img, mask=alpha_mask)

五、注意事项

  1. 尺寸匹配:掩膜的高度、宽度必须与原图像完全一致,否则报错;
  2. 通道数:掩膜通常为单通道(灰度图),若原图像为多通道,OpenCV 会自动将掩膜应用到所有通道;
  3. 数据类型 :掩膜需为uint8类型,非零值(通常 255)表示有效区域;
  4. 运算效率:掩膜操作通过硬件加速实现,效率远高于手动遍历区域。

六、完整示例:掩膜区域增强

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并创建掩膜
img = cv2.imread('flower.jpg')
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask = cv2.circle(mask, (img.shape[1]//2, img.shape[0]//2), 100, 255, -1)  # 圆形掩膜

# 仅增强掩膜区域的亮度和对比度
enhanced = img.copy()
enhanced = cv2.convertScaleAbs(enhanced, alpha=1.5, beta=30)  # 全局增强
masked_enhanced = np.where(mask[:, :, np.newaxis], enhanced, img)  # 仅掩膜区域应用增强

# 显示结果
plt.figure(figsize=(15, 5))
plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(132), plt.imshow(mask, cmap='gray'), plt.title('Mask')
plt.subplot(133), plt.imshow(cv2.cvtColor(masked_enhanced.astype(np.uint8), cv2.COLOR_BGR2RGB)), plt.title('Masked Enhanced')
plt.axis('off')
plt.show()
运行效果图:

总结

掩膜是 OpenCV 中控制图像处理范围的核心工具,通过二值化的 "有效 / 无效" 区域划分,实现精准的局部操作:

  • 创建方式:手动绘制、阈值分割、轮廓检测等;
  • 核心应用:区域提取、局部滤波、图像合成、直方图计算;
  • 优势:高效、灵活,避免对无关区域的无效处理。

掌握掩膜的使用,能大幅提升图像处理的精准度和效率,是实现复杂图像任务的基础技能。

相关推荐
MediaTea7 小时前
Python OOP 设计思想 13:封装服务于演化
linux·服务器·前端·数据库·python
love530love7 小时前
突破 ComfyUI 环境枷锁:RTX 3090 强行开启 comfy-kitchen 官方全后端加速库实战
人工智能·windows·python·cuda·comfyui·triton·comfy-kitchen
wang6021252187 小时前
流式输出注意点
python·状态模式·fastapi
未定义.2217 小时前
第3篇:UI自动化核心操作:输入、点击、弹窗、下拉框全场景实战
运维·python·ui·自动化·jenkins·集成测试·pytest
27669582927 小时前
vercel 安全检测逆向 x-vercel-challenge-solution
开发语言·python·solution·vercel-solution·x-vercel·vercel逆向·ensun
dagouaofei7 小时前
AI PPT 工具怎么选?5个维度对比6款产品
人工智能·python·powerpoint
لا معنى له7 小时前
学习笔记:目标跟踪内涵、方法及经典模型
人工智能·笔记·学习·计算机视觉·目标跟踪
深蓝电商API7 小时前
Scrapy日志系统详解与生产环境配置
爬虫·python·scrapy
Irene.ll7 小时前
DAY25 异常处理
python
格林威7 小时前
工业零件表面粗糙度评估:非接触式测量的 7 项核心技术,附 OpenCV+Halcon 实战代码!
人工智能·深度学习·数码相机·opencv·机器学习·计算机视觉·视觉检测