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

如何使用Python OpenCV从黑色背景中掩膜提取目标对象

Python+OpenCV提取目标并去除黑色背景实现方案

你当前使用的手动指定ROI多边形的方案仅适用于固定位置、固定形状的目标提取,针对黑色背景下提取任意目标的需求,可使用自动阈值生成掩模的方案,无需手动标注坐标,适配性更强。

示例图片

完整实现代码

import cv2
import numpy as np

# 读取图像,-1参数保留原通道(含alpha通道的图也能正常读取)
image = cv2.imread('/content/image1.jpg', -1)
h, w = image.shape[:2]

# 生成黑色背景的掩模:BGR三通道值均低于30的像素判定为黑色背景,可根据实际场景调整阈值
lower_black = np.array([0, 0, 0], dtype=np.uint8)
upper_black = np.array([30, 30, 30], dtype=np.uint8)
# 得到背景掩模:背景区域为255,目标区域为0
bg_mask = cv2.inRange(image, lower_black, upper_black)
# 反转得到目标掩模:目标区域为255,背景为0
target_mask = cv2.bitwise_not(bg_mask)

# -------------- 方案1:输出带透明背景的PNG结果 --------------
if image.shape[2] == 3:
    # 原图是3通道BGR,新增alpha通道
    b, g, r = cv2.split(image)
    # 把目标掩模作为alpha通道,背景区域透明
    alpha = target_mask
    image_with_alpha = cv2.merge((b, g, r, alpha))
    cv2.imwrite('target_transparent.png', image_with_alpha)
else:
    # 原图自带alpha通道,直接更新alpha值即可
    image[..., 3] = cv2.bitwise_and(image[..., 3], target_mask)
    cv2.imwrite('target_transparent.png', image)

# -------------- 方案2:输出目标保留原色彩、背景为黑色的结果(和你原有代码输出逻辑一致) --------------
masked_image = cv2.bitwise_and(image, image, mask=target_mask)
cv2.imwrite('target_black_bg.png', masked_image)

可调参数说明

  • 黑色阈值上下限lower_black、upper_black:如果背景不是纯黑、存在偏色或者暗部噪点,可以适当调高upper_black的三个通道数值,直到掩模能完整抠出目标、没有多余背景残留
  • 如果场景中存在光影变化,可换成HSV颜色空间做阈值分割,抗干扰性更强:
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    lower_black = np.array([0, 0, 0])
    upper_black = np.array([180, 255, 40])
    bg_mask = cv2.inRange(hsv, lower_black, upper_black)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:06:02