如何为图像数据集批量提取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
相关产品推荐
相关产品推荐

