一、需求
之前写过一篇博文,二阶降解模拟真实含噪低分辨图像,此方法模拟的效果较好。现总结一个使用OepnCV批量随机添加运动模糊、高斯噪声和泊松噪声代码。
二、代码使用方法
使用代码时,需要修改的地方见下:
三、代码
完整代码见下:
import os
import cv2
import numpy as np
import random
src_folder = 'Images/Visible_Images'
dst_folder = 'Images/Visible_Images_addBlurNoise'
# 如果目标文件不存在,则创建它
# os.makedirs(dst_folder,exist_ok = True)
# 添加高斯噪声
def add_gaussian_noise(image,mean=0,stddev=25):
noise = np.random.normal(mean,stddev,image.shape).astype(np.uint8)
noise_image = cv2.add(image,noise)
return noise_image
# 添加泊松噪声
def add_poisson_noise(image,scale=1.0):
# noise = np.random.poisson(image/255.0*100).astype(np.uint8)
vals = len(np.unique(image))
vals = 2 ** np.ceil(np.log2(vals))
noise = np.random.poisson(image / 255.0 * vals * scale) / float(vals) * 255
# noise_image = cv2.add(image,noise)
noise_image = noise.astype(np.uint8)
return noise_image
# 遍历源文件中的所有文件
for filename in os.listdir(src_folder):
# 构建完整的文件路径
src_path = os.path.join(src_folder,filename)
# 检查文件是否为图片
# if filename.endswith((".png",".jpg",".jpeg",".bmp",".tiff")):
if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff')):
img = cv2.imread(src_path,-1)
# 检测图片是否读取成功
if img is not None:
# 应用高斯模糊,卷积核大小为(3,3)
blurred_img = cv2.GaussianBlur(img,(3,3),0)
# 随机决定石头添加高斯噪声或泊松噪声
if random.choice(['gaussian','poission']) == 'gaussian':
# 调整高斯噪声的标准差,增大stddev会增加噪声强度
noise_img = add_gaussian_noise(blurred_img,mean=0, stddev=10)
else:
# 调整泊松噪声的scale因子,增大scale会增加噪声强度
noise_img = add_poisson_noise(blurred_img,scale=1)
output_name = filename[:-4]+"_GaussianBlurPoissonNoise"+".bmp"
print(output_name)
# 构建文件路径
dst_path = os.path.join(dst_folder,output_name)
# 保存图像
cv2.imwrite(dst_path,noise_img)
else:
print(f"无法读取图像:{src_path}")
else:
print(f"跳过非图像文件:{src_path}")
print("所有图像已经成功添加高斯模糊和随机噪声并保存到指定路径:",dst_folder)
四、效果图
下面,左侧为原图,右侧为模糊加噪效果图:
注:由于代码中加噪是随机的,每次运行结果会有差异。