Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)

图像掩膜(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()

关键知识点解析

  1. 掩膜创建核心 :
    • 先通过np.zeros创建纯黑画布,尺寸与原图一致;
    • cv.fillPoly将目标多边形区域填充为白色(255),形成 "白区保留、黑区屏蔽" 的掩膜模板。
  2. 坐标重塑规则 :多边形顶点数组需通过reshape((-1, 1, 2))转换维度,否则fillPoly无法识别坐标格式。
  3. 按位与操作原理 :cv.bitwise_and(src, outimage, mask=outimage) 仅当掩膜像素为 255(白色)时,保留原图对应位置像素;掩膜为 0(黑色)时,结果像素置 0。
  4. 参数说明 :
    • cv.fillPoly第三个参数1表示闭合多边形;
    • 掩膜需与原图通道数一致(灰度图单通道,彩色图 3 通道)。

实用扩展技巧

  • 提取彩色图区域:将掩膜改为 3 通道(np.zeros((h,w,3), np.uint8)),其余逻辑不变;
  • 圆形掩膜:用cv.circle替换fillPoly,填充圆形区域为白色;
  • 多区域掩膜:定义多个顶点数组,循环调用fillPoly填充多个白色区域。

总结

  1. 图像掩膜操作核心是 "创建掩膜模板 + 按位与提取",掩膜白色区域为保留区、黑色为屏蔽区;
  2. 多边形掩膜需先重塑坐标维度,确保与 OpenCV 绘图 API 兼容;
  3. 掩膜尺寸 / 通道数必须与原图一致,否则会触发维度不匹配报错。
相关推荐
叼烟扛炮12 分钟前
Linux 学习笔记(三):文件管理与文本查看
linux·笔记·学习
海绵宝宝转agent13 分钟前
2026-10-21学习笔记
笔记·学习·算法
动词ing14 分钟前
【学习笔记】51单片机 点亮一个LED灯
笔记·学习·51单片机
zhangrelay15 分钟前
手机十周年以上长期稳定测试意义不大正常非暴力使用电池健康都在七成以上
笔记·学习·智能手机
乐橙开放平台20 分钟前
门店监控想集中看?乐橙含光支持多品牌摄像头跨店管理
网络·笔记·物联网·自动化·音视频·智能家居
深圳老胡27 分钟前
STM32C5A3ZG开发板网络接口配置流程详解
笔记·stm32·单片机·代码规范
Z21-X28 分钟前
云原生运维学习笔记:存储、网络与操作系统——云计算的底层基石
运维·笔记·学习·云原生
深圳老胡1 小时前
STM32C5A3ZG 开发板调试笔记:USB 复用 ST-Link 与工程生成警告说明
笔记·stm32·单片机·代码规范
职豚求职小程序2 小时前
易方达基金27秋招笔试|场次+考情全梳理
笔记
dadaobusi9 小时前
学习: PCIe 6.0 的 L0p
学习