使用Keras批量增强文件夹内TIFF格式卫星图像时NumpyArrayIterator报错如何解决
批量处理TIFF图像触发维度报错的核心原因
报错信息中提到传入的数组shape为(0,),本质是你最终传给
datagen.flow()的输入是一个空的一维数组,完全不满足ImageDataGenerator要求的4维输入规范(标准格式为(样本数量, 图像高度, 图像宽度, 通道数))。逐张处理正常、批量报错,说明批量读取阶段根本没有把有效图像加载进数据集。
代码中的具体漏洞
- 后缀匹配逻辑失效
现有判断image_name.split('.')[1] == 'TIFF'存在两个硬伤:- 匹配时区分大小写,实际磁盘上的TIFF文件后缀大多是小写的
tif/tiff,大写匹配的成功率极低,符合条件的图像根本进不到读取逻辑里; - 依赖
split('.')取索引的判断方式,遇到文件名含多个点(比如S2_2024.tiff.tmp)时会取错后缀位置,造成漏判。
最终循环跑完,用来存图像的dataset列表始终是空列表,转成numpy数组自然就是shape为(0,)的空数组,直接触发维度不匹配报错。
- 匹配时区分大小写,实际磁盘上的TIFF文件后缀大多是小写的
- 文件路径拼接错误
现有代码写的是io.imread(image_directory + image_name),其中image_directory的值为'E:\\opencv',路径末尾没有添加分隔符,拼出来的地址类似E:\\opencvxxx.tiff,属于无效路径,就算后缀判断正确,图像也读不进来。 - 缺失必要的依赖导入
代码中用到的os.listdir、Image.fromarray、np.array对应的os、PIL.Image、numpy模块从未导入,运行到图像读取步骤时会直接抛出NameError中断。 - 图像模式强制转换和卫星图像特性不兼容
现有代码写的Image.fromarray(image, 'RGB')会强制按3通道RGB格式解析图像,但多数卫星TIFF为单通道灰度、多波段(4/8/16波段)存储,强制指定RGB模式会触发格式不匹配,导致图像读取失败被跳过,进一步造成dataset为空。
修正后的可运行参考代码
# 补全缺失的依赖导入 import os import numpy as np from PIL import Image from keras.preprocessing.image import ImageDataGenerator from skimage import io datagen = ImageDataGenerator( rotation_range=45, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='constant', cval=125) image_directory = 'E:\\opencv' SIZE = 150 dataset = [] my_images = os.listdir(image_directory) for i, image_name in enumerate(my_images): # 统一转小写做后缀匹配,兼容tif/tiff大小写、多文件名点的场景 file_ext = os.path.splitext(image_name)[1].lower() if file_ext in ['.tif', '.tiff']: # 用系统自带的路径拼接函数,避免缺斜杠的问题 img_path = os.path.join(image_directory, image_name) image = io.imread(img_path) # 适配卫星图像的通道结构,避免强制RGB转换报错 if len(image.shape) == 2: # 单通道灰度图补成3通道适配输入格式 image = np.stack([image]*3, axis=-1) elif image.shape[2] > 3: # 多波段图取前3个波段开展增强 image = image[:, :, :3] image = Image.fromarray(image) image = image.resize((SIZE,SIZE)) dataset.append(np.array(image)) # 增加空值校验,避免空数组直接传入生成器 if len(dataset) == 0: raise ValueError("未读取到任何有效TIFF图像,请检查文件路径和后缀匹配规则") x = np.array(dataset) i = 0 for batch in datagen.flow(x, batch_size=16, save_to_dir='E:\\opencv', save_prefix='a', save_format='tiff'): i += 1 if i > 20: break
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

