如何为图像添加高斯噪声并保存生成的新图像文件
问题原因
skimage.util.random_noise() 的返回值是取值范围为[0, 1]的float64类型NumPy数组,不是PIL库的Image对象,因此无法直接调用PIL的save()方法。
解决方法
你可以选择以下任意一种方案完成保存:
方案1:转换回PIL Image对象后保存
先把NumPy数组的取值转换为图像通用的[0, 255]无符号整数格式,再转回PIL对象即可正常调用save方法,示例代码如下:
import os import skimage import numpy as np from PIL import Image # 配置输入、输出目录 input_path = '/home/onur/Downloads/datasets/LFW-a/lfw2/' output_path = '/home/onur/Downloads/datasets/LFW-a/lfw2_gaussian_noise/' # 自动创建输出目录,避免路径不存在报错 os.makedirs(output_path, exist_ok=True) for img_name in os.listdir(input_path): img_full_path = os.path.join(input_path, img_name) # 跳过目录项,仅处理文件 if not os.path.isfile(img_full_path): continue # 读取原始图像 img = Image.open(img_full_path) # 添加高斯噪声 noisy_img = skimage.util.random_noise(img, mode='gaussian', seed=None, clip=True) # 数值范围转换到[0,255]并转为uint8类型 noisy_img = (noisy_img * 255).astype(np.uint8) # 转回PIL格式 noisy_img_pil = Image.fromarray(noisy_img) # 保存图像 noisy_img_pil.save(os.path.join(output_path, img_name))
方案2:直接用skimage自带IO接口保存
如果不需要转回PIL格式做后续处理,也可以直接用skimage的io模块保存数组,同样需要先做数值格式转换:
import os import skimage from skimage import io from PIL import Image input_path = '/home/onur/Downloads/datasets/LFW-a/lfw2/' output_path = '/home/onur/Downloads/datasets/LFW-a/lfw2_gaussian_noise/' os.makedirs(output_path, exist_ok=True) for img_name in os.listdir(input_path): img_full_path = os.path.join(input_path, img_name) if not os.path.isfile(img_full_path): continue img = Image.open(img_full_path) noisy_img = skimage.util.random_noise(img, mode='gaussian', seed=None, clip=True) # 转换格式后直接保存 io.imsave( os.path.join(output_path, img_name), (noisy_img * 255).astype(np.uint8) )
注意事项
- 必须做
[0,1]到[0,255]的数值范围转换和类型转换,否则保存的图像会出现全白、全黑或者类型报错问题 - 建议单独创建输出目录存放加噪后的图像,避免覆盖原始数据集文件
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

