开发者

如何用python给数据加上高斯噪声

目录
  • python给数据加上高斯噪声
    • 回顾MATLAB中的加高斯噪声
    • Python中利用numpy给数据加噪声
  • python批量给图形添加噪声
    • 高斯噪声
    • 椒盐噪声
    • 随机噪声
  • 总结

    python给数据加上高斯噪声

    一开始用MATLAB给数据加噪声很简单,就一句话:

    % 给数据加指定SNR的高斯噪声
    signal_noise = awgn(signal,SNR,'measured');

    但用python实现加噪声的时候遇到一个小问题,也是由于本人愚钝的原因吧。

    回顾MATLAB中的加高斯噪声

    常用方法:

    % 给数据加指定SNR的高斯噪声
    signal_noise = awgn(signal,SNR,'measured');
    Ps=sum(sum((signal-mean(mean(signal))).^2));     %signal power
    Pn=sum(sum((signal-signal_noise).^2));       %noise power
    snr=10*log10(Ps/Pn);        %验证所加的噪声

    这里的signal 是一个二维的数据矩阵,所以后面的操作都是矩阵的操作。MATLAB中运行完全没有问题。

    Python中利用numpy给数据加噪声

    本文方法:

    # 给数据加指定SNR的高斯噪声
    SNR = 5
    noise = np.random.randn(signal.shape[0],signal.shape[1])  #产生N(0,1)噪声数据
    noise = noise-np.mean(noise)         #均值为0
    signal_power = np.linalg.norm( signal - signal.mean() )**2 / signal.size #此处是信号的std**2
    noise_variance = signal_power/np.power(10,(SNR/10))     #此处是噪声的std**2
    noise = (np.sqrt(noise_variance) / np.std(noise) )*noise  ##此处是噪声的std**2
    signal_noise = noise + signal
    Ps = ( np.linalg.norm(signal - signal.mean()) )**2     #signal power
    Pn = ( np.linalg.norm(signal - signal_noise ) )**2     #noise power
    snr = 10*np.log10(Ps/Pn)

    有很多人在产生给定SNR的高斯噪声时,用的是:

    signal_power = np.linalg.norm( signal )**2
    noise_variance = signal_power/np.power(10,(SNR/10))
    noise = np.sqrt(noise_variance)*noise + 0

    这里实际上是有问题的,我一开始也没发现。因为产生分布为N(mean,std**2)的噪声我们用的公式是:

    noise = std * N(0,1) + mean

    换句话说,我们需要计算噪声的std 以及 mean 。

    计算噪声的 std 时,需要先计算信号的 std,然后利用SNR来求出噪声的 std ,从上面的代码中能发现,signal_power 代表的是信号的std^2 与 signal.size 的乘积,多乘了一个signal.size 那结果肯定是有问题的。

    python批量给图形添加噪声

    python代码实现批量给图形添加高斯噪声和椒盐噪声

    高斯噪声

    import cv2
    import os
    import numpy as np
    def add_noise_Guass(img, mean=0, var=0.01): # 添加高斯噪声
      img = np.array(img / 255, dtype=float)
      noise = np.random.normal(mean, var ** 0.5, img.shape)
      out_img = img + noise
      if out_img.min() < 0:
        low_clip = -1
      else:
        low_clip = 0
        out_img = np.clip(out_img, low_clip, 1.0)
        out_img = np.uint8(out_img * 255)
      return out_img
    # 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
    def read_directory(directory_name):
      for filename in os.listdir(directory_name):
        pripythonnt(filename) # 仅仅是为开发者_开发学习了测试
        img = cv2.imread(directory_name + "/" + filename)
        #####显示图片#######
        out_img = add_noise_Guass(img)
        cv2.imshow("img", out_img)
        cv2.waitKey(0)
        #####################
        #####保存图片#########
        cv2.imwrite("C:/Users/Dong.Shao2/Desktop/DataSet/gaussian" + "/" + filename, out_img * 255)
    read_directory("C:/Users/Dong.Shao2/Desktop/DataSet/image")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)

    椒盐噪声

    import cv2
    import random
    import os
    import numpy as np
    def add_salt_pepper(img, prob):
      resultImg = np.zeros(img.shape, np.uint8)
      thres = 1 - prob
      for i in range(img.shape[0]):
        for j in range(img.shape[1]):
          rdn = random.random()
          if rdn < prob:
            resultImg[i][j] = 0
          elif rdn > thres:
            resultImg[i][j] = 255
          else:
            resultImg[i][j] = img[i][j]
      return resultImg
    # 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
    def read_directory(directory_name):
      for filename in os.listdir(directory_name):
        print(filename) # 仅仅是为了测试
        img = cv2.imread(directory_name + "/" + filename)
        #####显示图片#######
        out_img = add_salt_pepper(img,0.05)
        cv2.imshow("img", out_img)
        cv2.waitKey(0)
        #####################
        #####保存图片#########
        cv2.imwrite("C:/Users/Dong.Shao2/Desktop/DataSet/salt_pepper" + "/" + filename, out_img )
    read_directory("C:/Users/Dong.Shao2/Desktop/DataSet/image")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)

    随机噪声

    import cv2
    import os
    import numpy as np
    def random_noise(image,noise_num):
      '''
      添加随机噪点(实际上就是随机在图像上将像素点www.devze.com的灰度值变为255即白色)
      param image: 需要加噪的图片
      param noise_num: 添加的噪音点数目
      return: img_noise
      '''
      # 参数image:,noise_num:
      img_noise = image
      # cv2.imshow("src", img)
      rows, cols, chn = img_noisejavascript.shape
      # 加噪声
      for i in range(noise_num):
        x = np.random.randint(0, rowandroids)#随机生成指定范围的整数
        y = np.random.randint(0, cols)
        img_noise[x, y, :] = 255
      return img_noise
    # 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
    def read_directory(directory_name):
      for filename in os.listdir(directory_name):
        print(filename) # 仅仅是为了测试
        img = cv2.imread(directory_name + "/" + filename)
        #####显示图片#######
        out_img = random_noise(编程img,10000)
        cv2.imshow("img", out_img)
        cv2.waitKey(0)
        #####################
        #####保存图片#########
        cv2.imwrite("C:/Users/Dong.Shao2/Desktop/DataSet/random" + "/" + filename, out_img )
    read_directory("C:/Users/Dong.Shao2/Desktop/DataSet/image")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜