遍历图像执行数据增强时报UnidentifiedImageError的原因是什么?
问题原因及修复方案
可能的报错原因
- 文件格式不匹配:虽然文件名后缀为.jpg,但实际文件并非标准JPEG格式,可能是其他格式图片强制修改后缀得到,也可能是文件传输、存储过程中损坏导致头部信息缺失,解码工具无法识别。
- 解码工具兼容性不足:代码中调用
io.imread时指定了plugin='matplotlib',matplotlib的图像读取接口对非常规JPEG格式(比如CMYK色彩模式的JPEG、渐进式JPEG、部分编码不规范的摄像头输出JPEG)兼容性极差,很容易出现识别失败的问题。 - 代码逻辑隐含问题:现有代码未导入
os模块就直接调用os相关方法,同时遍历图片的循环中每次都会覆盖image变量,最终只会处理目录下的最后一张JPG图片,且如果遍历过程中碰到损坏的图片就会直接终止运行抛出报错。 - 权限异常:当前Python运行进程没有读取
36.jpg文件的权限,也会触发识别类报错。
修复建议
- 先验证文件合法性:用系统自带的图像查看器打开
36.jpg,确认可以正常预览,如果无法打开说明文件本身损坏,直接替换或删除即可;如果可以正常打开,尝试用PIL重新转存一次为标准JPEG格式。 - 替换图像读取方式:修改
io.imread的调用逻辑,移除plugin='matplotlib'参数,或者直接用Pillow库读取图片,示例代码如下:
from PIL import Image import numpy as np # 替换原有io.imread逻辑 image = np.array(Image.open(img).convert('RGB'))
- 补全代码缺失逻辑:先添加
import os导入语句,同时调整遍历逻辑,把数据增强的循环放到每张图片的读取逻辑内部,避免只处理最后一张图片的问题,调整后参考代码如下:
import os from keras.preprocessing.image import ImageDataGenerator from PIL import Image import numpy as np gen = ImageDataGenerator(rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.15, zoom_range=0.1, channel_shift_range=10., horizontal_flip=True, fill_mode='nearest') image_path = r'X:\Users\my_path' os.chdir(image_path) for img_name in os.listdir(image_path): if img_name.endswith(".jpg"): try: image = np.array(Image.open(img_name).convert('RGB')) image = image.reshape((1, ) + image.shape) i = 0 for batch in gen.flow(image, batch_size=16, save_to_dir=image_path, save_prefix='aug', save_format='jpg'): i += 1 if i > 5: break except Exception as e: print(f"处理文件{img_name}失败,错误信息:{e}") # 可自行选择删除损坏文件或跳过 continue
- 检查文件权限:确认
36.jpg没有被设置为只读或禁止当前用户访问的权限。
内容的提问来源于stack exchange,提问作者Egorsky
相关产品推荐
相关产品推荐

