如何使用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
相关产品推荐
相关产品推荐

