【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 中控制图像处理范围的核心工具,通过二值化的 "有效 / 无效" 区域划分,实现精准的局部操作:

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

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

相关推荐
Predestination王瀞潞44 分钟前
安装了Anaconda在系统终端却无法使用python命令
linux·开发语言·python
程序员小远9 小时前
软件测试之单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
心无旁骛~10 小时前
python多进程和多线程问题
开发语言·python
星云数灵10 小时前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
计算机毕设匠心工作室10 小时前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥10 小时前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
计算机毕设小月哥12 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql