如何用python给数据加上高斯噪声
作者:迪普达克范特西
这篇文章主要介绍了如何用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): print(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): ''' 添加随机噪点(实际上就是随机在图像上将像素点的灰度值变为255即白色) param image: 需要加噪的图片 param noise_num: 添加的噪音点数目 return: img_noise ''' # 参数image:,noise_num: img_noise = image # cv2.imshow("src", img) rows, cols, chn = img_noise.shape # 加噪声 for i in range(noise_num): x = np.random.randint(0, rows)#随机生成指定范围的整数 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")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。