从numpy数组保存对抗样本图像时出现PIL类型不支持的TypeError错误
报错根因
- 本次
TypeError由两个问题共同触发:- 报错提示中的
<f4代表传入Image.fromarray的数组为float32类型,且像素值落在0-1区间,Pillow默认接口不支持直接读取该类浮点数组 - 报错显示的数组形状
(1,1,3)说明批次维度移除操作失效,残留了多个长度为1的冗余维度,数组不符合标准三通道图像(高, 宽, 3)的格式要求
- 报错提示中的
修复实现步骤
- 第一步:用
np.squeeze()彻底清除所有长度为1的冗余维度,得到形状规整的图像数组:x_adv = np.squeeze(x_adv) - 第二步:完成像素范围裁剪后,将0-1区间的浮点像素值映射到0-255区间,转换为Pillow兼容的uint8类型:
# 裁剪像素值到合法范围 x_adv = np.clip(x_adv, 0, 1) # 转换类型适配Pillow接口要求 x_adv = (x_adv * 255).astype(np.uint8) - 第三步:执行图像保存与下载逻辑即可正常运行:
from PIL import Image from google.colab import files img = Image.fromarray(x_adv) img.save("car.jpeg") files.download("car.jpeg")
注意:如果不做类型转换,也可以在调用
Image.fromarray时显式传入图像模式参数,但该方案对浮点值的要求为0-255取值范围,兼容性远低于转uint8的实现方案。
内容的提问来源于stack exchange,提问作者jay
相关产品推荐
相关产品推荐

