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

OpenCV图像ROI与非ROI区域裁剪实现及代码校验

问题背景

我有一张包含单个掩码的图像(附图中的蓝色标注用于展示掩码覆盖区域)。现有函数可裁剪蓝色标注所示ROI区域,需要同时实现非ROI区域的裁剪,同时确认对现有代码逻辑的注释理解是否存在错误。

带ROI标注的肾脏图像

现有代码理解校验

你对代码的注释理解没有错误,逐行逻辑说明如下:

def ROI_polygons(img, cnts, pad=5):
    def get_ROI_polygons(_img, _cnt, _pad):
        x1,y1,w,h = cv2.boundingRect(np.array(_cnt)) # 计算轮廓的最小外接正矩形,返回左上角坐标、矩形宽高
        x2,y2 = x1+w+_pad, y1+h+_pad # 右下角坐标外扩pad像素,增加裁剪边距
        x1, y1 = max(0, x1-_pad), max(0, y1-_pad) # 左上角坐标外扩pad像素,同时做边界校验避免坐标超出图像范围
        return _img[y1:y2, x1:x2] # 通过numpy数组切片裁剪得到ROI区域
    ROI_crops = [get_ROI_polygons(img, cnt, pad) for cnt in cnts] # 遍历所有输入轮廓,批量裁剪对应ROI
    return ROI_crops 
非ROI区域裁剪实现方案

根据常见使用场景,提供两种可直接复用的实现方式:

  • 保留原图尺寸,仅保留非ROI区域内容(ROI区域置为黑色)
    核心逻辑是通过轮廓生成反转掩码,再和原图做按位与运算,代码示例:
    def get_non_roi_keep_size(img, cnts):
        # 生成和原图同尺寸的单通道空掩码
        mask = np.zeros(img.shape[:2], dtype=np.uint8)
        # 将所有ROI轮廓区域填充为白色
        cv2.drawContours(mask, cnts, -1, 255, -1)
        # 反转掩码,此时非ROI区域为白色、ROI区域为黑色
        non_roi_mask = cv2.bitwise_not(mask)
        # 掩码与原图做与运算,仅保留非ROI区域的像素内容
        non_roi_result = cv2.bitwise_and(img, img, mask=non_roi_mask)
        return non_roi_result
    
  • 裁剪掉ROI所在的外接矩形,返回拆分后的非ROI矩形块
    核心逻辑是先计算所有ROI的整体外接矩形坐标,再拆分原图中不与ROI重叠的四个矩形区域(ROI上方、下方、左侧、右侧),逐个裁剪即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:27:35