TensorFlow加载文件夹图像数据集后PIL显示失真噪声问题
问题根源
你遇到的噪声类扭曲核心原因是数据类型不匹配,附带的比例变形是强制resize的逻辑问题:
tf.keras.utils.image_dataset_from_directory默认输出float32类型的张量,虽然像素值落在0-255区间,但PIL的Image.fromarray在RGB模式下要求输入必须是uint8类型的0-255整数数组,直接传入浮点型数组会被PIL错误解析像素值,最终呈现类似随机噪声的效果。- 你设置的
image_size=(1080,1920)默认会对所有图像做无差别拉伸缩放,不会保留原始宽高比,你数据集里存在(1920,1080,3)的横版图像,被强行拉成竖版尺寸本身就会出现比例扭曲,但这不会造成噪声效果。
修复方法
- 展示图像前先把数组转成
uint8类型即可解决噪声问题:
for image, labels in images.take(1): img = image[0].numpy().astype('uint8') # 转为PIL兼容的uint8整数格式 print(img.shape) img = Image.fromarray(img, 'RGB') img.save('my.png') img.show()
- 如果要避免不同比例图像被拉伸变形,给加载函数加
crop_to_aspect_ratio=True参数,加载时会自动按目标比例裁剪图像,而非强行拉伸:
images = image_dataset_from_directory('../dataset/', shuffle=True, batch_size=32, image_size=(1080,1920), crop_to_aspect_ratio=True)
注:如果后续做模型训练需要把像素归一化到0~1区间,再转float32除以255即可,仅在调用PIL展示/保存图像时做uint8转换就行。
内容的提问来源于stack exchange,提问作者Los
相关产品推荐
相关产品推荐

