使用OpenCV遍历图片报错:无法打开/读取文件,求解决方案
问题解决
核心错误:文件路径不完整
os.listdir(path)返回的只是文件夹里的文件名(比如001.jpg),而cv2.imread()默认在当前脚本的工作目录找文件,不是你指定的path目录,所以找不到文件。解决方法是把path和文件名拼接成完整路径:
img = cv2.imread(os.path.join(path, file))
其他代码问题修正
- 缩进错误:内层的
for i循环缩进不对,要和外层for file的代码块对齐 - 颜色转换参数写错:
cv2.cvt.COLOR_BGR2GRAY应该是cv2.COLOR_BGR2GRAY,而且你转换灰度后没有把结果赋值给变量,等于白转了。另外要注意:转灰度后图片是单通道(形状为(H,W)),但你后面patchify用的是(512,512,3)(3通道),会直接报错。如果要处理灰度图,把patchify的参数改成(512,512);如果要保留彩色图,就去掉灰度转换那行。 - 保存文件名重复:你现在固定用
000作为前缀,所有图片的patch都会重名覆盖,应该用原文件名的前缀(比如从001.jpg提取001) - 异常处理缩进:
raise Exception要和if not cv2.imwrite对齐,属于同一个代码块
修正后的完整代码
import os import cv2 import numpy as np import patchify path = 'C:/Users/j.brandstaeter/Desktop/Masterarbeit/graz/original_test/' save_path = 'C:/Users/j.brandstaeter/Desktop/Masterarbeit/graz/patches/images/' # 确保保存目录存在,不存在就创建 os.makedirs(save_path, exist_ok=True) files = os.listdir(path) for file in files : # 拼接完整文件路径 full_file_path = os.path.join(path, file) # 读取图片 img = cv2.imread(full_file_path) if img is None: print(f"跳过无法读取的文件:{full_file_path}") continue # 二选一:处理彩色图就用下面这行;处理灰度图就注释掉,用后面两行 patches_img = patchify.patchify(img, (512,512,3), step=512-64) # img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # patches_img = patchify.patchify(img, (512,512), step=512-64) # 提取文件名前缀(不带扩展名) file_prefix = os.path.splitext(file)[0] for i in range(patches_img.shape[0]): for j in range(patches_img.shape[1]): # 根据图片通道数选择patch的索引方式 single_patch_img = patches_img[i,j,0,:,:,:] if len(img.shape)==3 else patches_img[i,j,:,:] patch_file_name = f"{file_prefix}_{i}{j}.jpg" full_save_path = os.path.join(save_path, patch_file_name) if not cv2.imwrite(full_save_path, single_patch_img): raise Exception(f"保存patch失败:{full_save_path}")
额外建议
- 加入
img is None的判断,跳过损坏或无法读取的文件,避免脚本中途崩溃 - 用
os.makedirs(save_path, exist_ok=True)确保保存目录存在,防止保存时因为目录不存在报错
内容的提问来源于stack exchange,提问作者jules2703
相关产品推荐
相关产品推荐

