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

如何为图像数据集批量提取ROI?单张可行批量实现遇阻

批量提取图像ROI的问题修复方案

你的代码存在的核心问题

  • 混淆了文件夹路径和图像数组:cv2.selectROI()需要传入图像而非文件夹路径,且后续用img_folder(路径字符串)做数组切片完全错误
  • 变量名不统一:定义了roi却用r做切片,JPG变量未定义
  • 逻辑混乱:循环显示30张随机图后才选ROI,且没有对批量图像应用ROI的逻辑
  • 输出逻辑错误:没有遍历所有图像,也没有保留原文件名的处理

修复后的批量提取代码

import cv2
import os

# 文件夹路径
img_folder = r'Shrimp/train/Resized_Dataset'
output_dir = r'Cropped_shrimp'

# 创建输出文件夹(如果不存在)
os.makedirs(output_dir, exist_ok=True)

# 先选一张示例图确定ROI区域
sample_img_path = os.path.join(img_folder, os.listdir(img_folder)[0])
sample_img = cv2.imread(sample_img_path)
print("请在弹出窗口中框选ROI,按Enter确认")
roi = cv2.selectROI("选择ROI", sample_img)
cv2.destroyAllWindows()

# 解析ROI参数:x, y, w, h
x, y, w, h = roi

# 遍历所有图像批量裁剪
for filename in os.listdir(img_folder):
    if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
        img_path = os.path.join(img_folder, filename)
        img = cv2.imread(img_path)
        
        # 裁剪ROI
        roi_img = img[y:y+h, x:x+w]
        
        # 保存裁剪后的图像
        output_path = os.path.join(output_dir, f"cropped_{filename}")
        cv2.imwrite(output_path, roi_img)
        print(f"已处理:{filename}")

print("批量处理完成!")

代码说明

  • 先通过一张示例图获取ROI坐标,后续所有图像都用这个统一区域裁剪
  • 自动创建输出文件夹,避免路径不存在报错
  • 只处理图像格式文件,过滤其他杂项
  • 保留原文件名并添加前缀,方便对应原图像
  • 实时输出处理进度,便于查看状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:10:33