为图像添加高斯噪声

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)

你可能感兴趣的:(python,图像处理)