OpenCV图像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
相关产品推荐
相关产品推荐

