如何提取ROI边界并裁剪或掩膜掉感兴趣区域外的图像像素
ROI边界提取与ROI外像素剔除方案
前置说明
以下方案基于Python+OpenCV工具栈实现,其他图像处理框架可参考对应逻辑调整接口即可。
方案1:已有独立ROI标注掩码
如果你已经有单独的ROI掩码文件(即仅标注ROI区域的单通道图),可按以下步骤操作:
- 二值化掩码:将输入的ROI掩码做阈值分割,生成仅含0(非ROI)和255(ROI)的二值图,示例代码:
ret, binary_mask = cv2.threshold(input_roi_mask, 127, 255, cv2.THRESH_BINARY) - 提取ROI边界:调用轮廓检测接口直接获取ROI的连续边界坐标集:
contours, hierarchy = cv2.findContours(binary_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
返回的contours即为所有ROI边界的像素坐标集合。 - 剔除ROI外像素:将原始图像和二值掩码做按位与操作,直接抹除ROI外的所有像素:
processed_img = cv2.bitwise_and(original_img, original_img, mask=binary_mask)
方案2:仅存在带红色手绘边界的原图,无单独掩码
如果只有标注了红色ROI边界的原图,需要先提取边界再生成掩码:
- 色彩空间转换:将原图从BGR空间转为HSV空间,筛选红色对应的像素范围,生成红色边界的二值掩码
- 形态学运算:对边界掩码做闭运算填充边界内部空洞,即可得到完整的ROI区域二值掩码
- 后续操作和方案1的边界提取、像素剔除步骤完全一致。
注意:如果存在多个不连通的ROI区域,将轮廓检测的检索参数调整为cv2.RETR_LIST即可一次性提取所有ROI的边界
内容的提问来源于stack exchange,提问作者Xinlong Wang
相关产品推荐
相关产品推荐

