You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenCV生成基于手动高亮轮廓的图像二值掩码?

生成指定多边形区域的二值掩码(外部0,内部1)

针对你需要选中手动高亮标注区域、生成外部像素为0、内部为1的二值掩码的需求,结合你提供的代码,这里给出修正方案:

核心问题修正点

  • 现有代码依赖灰度阈值提取轮廓,无法精准定位手动标注的高亮区域,应该从彩色图像中直接提取标注颜色区域
  • 当前仅取第一个轮廓contours[0],未必是你需要的目标标注区域
  • 生成的掩码是3通道且填充值为255,不符合单通道、内部为1的要求

修正后的代码

import numpy as np
import cv2

# 读取图像
image = cv2.imread('data/baba.jpg')
# 转换为HSV空间,便于精准提取绿色高亮标注区域
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 定义绿色的HSV范围(可根据实际标注颜色微调参数)
lower_green = np.array([40, 40, 40])
upper_green = np.array([70, 255, 255])
# 提取绿色标注区域的掩码
green_mask = cv2.inRange(hsv, lower_green, upper_green)

# 从绿色掩码中提取最外层轮廓
contours, hierarchy = cv2.findContours(green_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 自动筛选目标轮廓:取面积最大的轮廓(对应你手动标注的主要区域)
target_cnt = max(contours, key=cv2.contourArea)

# 创建单通道空白掩码,初始全为0
mask = np.zeros(image.shape[:2], dtype=np.uint8)
# 在掩码上填充目标轮廓内部为1
cv2.drawContours(mask, [target_cnt], 0, 1, thickness=cv2.FILLED)

# 保存掩码:乘255是为了让图像正常显示(黑/白),实际使用时直接用mask数组即可
cv2.imwrite('data_new/mask_binary.jpg', mask * 255)

# 查看结果
cv2.imshow('Binary Mask', mask * 255)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键说明

  • 精准提取标注区域:通过HSV颜色空间锁定手动标注的绿色区域,比灰度阈值更可靠
  • 自动轮廓筛选:用面积筛选避免手动指定轮廓索引的误差,适配单/多个标注的情况
  • 符合需求的掩码格式:生成单通道掩码,严格遵循外部0、内部1的要求,保存时的乘255仅为可视化需求

内容的提问来源于stack exchange,提问作者DavidRuben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:30:33