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

如何使用Python基于二值掩码提取图像的感兴趣区域

Python实现二值掩码提取图像ROI

以下实现完全匹配Matlab对应方案的输出效果:通过二值掩码过滤非感兴趣区域后,自动裁剪到目标区域的最小外接矩形,无多余空白边。

  • 原始测试图像:原始输入图像
  • 对应二值掩码:二值掩码图像

依赖安装

仅需NumPy和OpenCV两个库,执行以下命令安装:
pip install numpy opencv-python

完整实现代码

import cv2
import numpy as np

# 读取原始图像,保留原有通道信息
origin_img = cv2.imread("original.png", cv2.IMREAD_UNCHANGED)
# 读取二值掩码,强制转为单通道灰度格式
binary_mask = cv2.imread("mask.png", cv2.IMREAD_GRAYSCALE)

# 定位掩码中所有非零(目标区域)的像素坐标
nonzero_y, nonzero_x = np.where(binary_mask > 0)
# 计算目标区域最小外接矩形的边界值
x_left, x_right = nonzero_x.min(), nonzero_x.max()
y_top, y_bottom = nonzero_y.min(), nonzero_y.max()

# 为原始图像添加Alpha通道,实现非目标区域透明(匹配Matlab默认输出效果)
if len(origin_img.shape) == 2:
    # 兼容灰度格式原图
    img_with_alpha = cv2.cvtColor(origin_img, cv2.COLOR_GRAY2BGRA)
elif origin_img.shape[2] == 3:
    # 兼容三通道彩色原图
    img_with_alpha = cv2.cvtColor(origin_img, cv2.COLOR_BGR2BGRA)
else:
    img_with_alpha = origin_img.copy()

# 将掩码值赋值给Alpha通道:目标区域完全不透明,其余区域完全透明
img_with_alpha[:, :, 3] = binary_mask

# 按最小外接矩形范围裁剪,得到最终ROI
extracted_roi = img_with_alpha[y_top:y_bottom+1, x_left:x_right+1]

# 保存提取结果
cv2.imwrite("extracted_roi.png", extracted_roi)

可选调整

  • 如果不需要透明背景,想让非目标区域显示为黑色,可以删除Alpha通道相关逻辑,替换为位运算应用掩码:
    masked_img = cv2.bitwise_and(origin_img, origin_img, mask=binary_mask)
    之后直接对masked_img按计算好的边界裁剪即可。
  • 如果需要给非目标区域设置其他纯色背景,只需要创建和原图同尺寸的纯色画布,再通过掩码把原图目标区域的像素复制到画布上,最后裁剪即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:15:51