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. 掩膜尺寸 / 通道数必须与原图一致,否则会触发维度不匹配报错。
相关推荐
炎爆的土豆翔2 小时前
OpenCV 阈值二值化优化实战:LUT 并行、手写 AVX2 与 cv::threshold 性能对比
人工智能·opencv·计算机视觉
Westward-sun.4 小时前
OpenCV 实战:银行卡号识别系统(基于模板匹配)
人工智能·opencv·计算机视觉
盐水冰4 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
Hello小赵4 小时前
视频压缩编码学习(一)—— 基础知识大集合
学习
左左右右左右摇晃4 小时前
计算机网络笔记整理
笔记·计算机网络
不吃西红柿的854 小时前
[职场] 内容运营求职简历范文 #笔记#职场发展
笔记·职场和发展·内容运营
似水明俊德5 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net
智者知已应修善业5 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
adore.9686 小时前
3.18 复试学习
学习
C羊驼6 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程