Keras ImageDataGenerator加载图像失真问题求助
问题原因
- Keras的
ImageDataGenerator配合flow_from_directory使用时,默认会将图像像素值归一化到[0, 1]区间的float32类型,但PIL的Image.fromarray()处理RGB图像时,要求输入必须是**[0, 255]区间的uint8整数类型**。直接将float类型的数组传入会导致像素值解析错误,进而出现颜色分离错乱,保存的文件也会因格式不合法被提示损坏。
解决办法
有两种简单的修复方案:
方法1:手动转换像素值类型
在生成PIL图像前,将归一化后的float数组乘以255,并转换为uint8类型:
# 修正后的失真图像处理代码 img = Image.fromarray((imgdata[0] * 255).astype(np.uint8), "RGB") img.save(f"DogFixed.png") img.show()
方法2:关闭自动归一化
初始化ImageDataGenerator时设置rescale=None(默认值为1./255),让加载的图像保持原始的uint8格式:
# 初始化时关闭自动归一化 datagen = ImageDataGenerator(rescale=None) train_ds = datagen.flow_from_directory(Data_Directory, target_size=(128, 128)) # 后续代码无需修改,直接生成正常图像 data = train_ds.next() imgdata = np.array(data[0]) img = Image.fromarray(imgdata[0], "RGB") img.save(f"DogFixed.png") img.show()
适用场景说明
- 方法1适合模型训练需要归一化的场景,仅在可视化图像时做类型转换;
- 方法2适合不需要归一化的场景,直接保留原始像素格式。
内容的提问来源于stack exchange,提问作者JoshW
相关产品推荐
相关产品推荐

