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)
五、注意事项
- 尺寸匹配:掩膜的高度、宽度必须与原图像完全一致,否则报错;
- 通道数:掩膜通常为单通道(灰度图),若原图像为多通道,OpenCV 会自动将掩膜应用到所有通道;
- 数据类型 :掩膜需为
uint8类型,非零值(通常 255)表示有效区域; - 运算效率:掩膜操作通过硬件加速实现,效率远高于手动遍历区域。
六、完整示例:掩膜区域增强
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 中控制图像处理范围的核心工具,通过二值化的 "有效 / 无效" 区域划分,实现精准的局部操作:
- 创建方式:手动绘制、阈值分割、轮廓检测等;
- 核心应用:区域提取、局部滤波、图像合成、直方图计算;
- 优势:高效、灵活,避免对无关区域的无效处理。
掌握掩膜的使用,能大幅提升图像处理的精准度和效率,是实现复杂图像任务的基础技能。