noise = np.random.normal(mean, var ** 0.5, image.shape)
前两个参数分别为均值和标准差,第三个参数为生成数据的 shape。
在很多应用中,为了方便计算,都会将图像数据转换为浮点数,取值范围为 [0, 1]。为了转换数据类型,最简单的方式是直接除以255:
image = image/255
由于需要把噪声叠加到原图像中,因此叠加后的数据值就可能超出对应数据类型的取值范围。因此需要使用np.clip,将图像截断到 [0, 1]之间。
import numpy as np
import cv2
import os
input_dir = "clean" #存放原始图片的文件夹
out_dir = "noisy" #存放噪声图片的文件夹
def gauss_noise(img, mean, sigma):
image = np.array(img / 255, dtype=float) # 将原始图像的像素值进行归一化,除以255使得像素值在0-1之间
noise = np.random.normal(mean, sigma/255.0, image.shape) # 创建一个均值为mean,方差为sigma,呈高斯分布的图像矩阵
out = image + noise # 将噪声和原始图像进行相加得到加噪后的图像
resultImg = np.clip(out, 0.0, 1.0)
resultImg = np.uint8(resultImg * 255.0)
# 解除归一化,乘以255将加噪后的图像的像素值恢复
# opencv存储的数据格式只能为unit8类型
return resultImg
if __name__ == '__main__':
a = os.listdir(input_dir)
for i in a:
print(i)
img = cv2.imread(input_dir +'/'+i,cv2.IMREAD_GRAYSCALE )
resultImg = gauss_noise(img, 0, 25)
resultImg = cv2.imwrite(out_dir+'/'+i,resultImg)