图像掩膜(Mask)是提取图像局部区域的核心技巧,通过创建与原图匹配的掩膜模板,结合按位与操作可精准保留目标区域、屏蔽其他区域。本文通过极简代码,演示多边形掩膜的创建与图像掩膜提取的完整流程。
核心代码实现
python
import cv2 as cv
import numpy as np
# 1. 以灰度模式读取原图
src = cv.imread(".\image\1.bmp", 0)
if src is None:
print('could not load image')
exit()
# 2. 定义多边形掩膜顶点坐标(矩形区域示例)
site = np.array([[400, 200], [300, 200], [300, 100], [400, 100]], dtype=np.int32)
# 重塑坐标格式(适配polylines/fillPoly要求)
site = site.reshape((-1, 1, 2))
# 3. 创建与原图同尺寸的纯黑掩膜画布
outimage = np.zeros((src.shape[0], src.shape[1]), np.uint8)
# 绘制多边形轮廓(可选,仅可视化)
cv.polylines(outimage, [site], 1, 255)
# 填充多边形区域为白色(255),形成掩膜模板
cv.fillPoly(outimage, [site], 255)
# 4. 按位与操作:仅保留掩膜白色区域的原图像素
masked = cv.bitwise_and(src, outimage, mask=outimage)
# 5. 显示结果
cv.imshow("outimage", masked)
cv.waitKey(0)
cv.destroyAllWindows()
关键知识点解析
- 掩膜创建核心 :
- 先通过
np.zeros创建纯黑画布,尺寸与原图一致; cv.fillPoly将目标多边形区域填充为白色(255),形成 "白区保留、黑区屏蔽" 的掩膜模板。
- 先通过
- 坐标重塑规则 :多边形顶点数组需通过
reshape((-1, 1, 2))转换维度,否则fillPoly无法识别坐标格式。 - 按位与操作原理 :
cv.bitwise_and(src, outimage, mask=outimage)仅当掩膜像素为 255(白色)时,保留原图对应位置像素;掩膜为 0(黑色)时,结果像素置 0。 - 参数说明 :
cv.fillPoly第三个参数1表示闭合多边形;- 掩膜需与原图通道数一致(灰度图单通道,彩色图 3 通道)。
实用扩展技巧
- 提取彩色图区域:将掩膜改为 3 通道(
np.zeros((h,w,3), np.uint8)),其余逻辑不变; - 圆形掩膜:用
cv.circle替换fillPoly,填充圆形区域为白色; - 多区域掩膜:定义多个顶点数组,循环调用
fillPoly填充多个白色区域。
总结
- 图像掩膜操作核心是 "创建掩膜模板 + 按位与提取",掩膜白色区域为保留区、黑色为屏蔽区;
- 多边形掩膜需先重塑坐标维度,确保与 OpenCV 绘图 API 兼容;
- 掩膜尺寸 / 通道数必须与原图一致,否则会触发维度不匹配报错。