如何用python給數(shù)據(jù)加上高斯噪聲
python給數(shù)據(jù)加上高斯噪聲
一開(kāi)始用MATLAB給數(shù)據(jù)加噪聲很簡(jiǎn)單,就一句話:
% 給數(shù)據(jù)加指定SNR的高斯噪聲 signal_noise = awgn(signal,SNR,'measured');
但用python實(shí)現(xiàn)加噪聲的時(shí)候遇到一個(gè)小問(wèn)題,也是由于本人愚鈍的原因吧。
回顧MATLAB中的加高斯噪聲
常用方法:
% 給數(shù)據(jù)加指定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);?? ??? ??? ??? ??? ??? ??? ??? ?%驗(yàn)證所加的噪聲
這里的signal 是一個(gè)二維的數(shù)據(jù)矩陣,所以后面的操作都是矩陣的操作。MATLAB中運(yùn)行完全沒(méi)有問(wèn)題。
Python中利用numpy給數(shù)據(jù)加噪聲
本文方法:
# 給數(shù)據(jù)加指定SNR的高斯噪聲 SNR = 5 noise = np.random.randn(signal.shape[0],signal.shape[1]) ?? ?#產(chǎn)生N(0,1)噪聲數(shù)據(jù) noise = noise-np.mean(noise) ?? ??? ??? ??? ??? ??? ??? ??? ?#均值為0 signal_power = np.linalg.norm( signal - signal.mean() )**2 / signal.size?? ?#此處是信號(hào)的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)
有很多人在產(chǎn)生給定SNR的高斯噪聲時(shí),用的是:
signal_power = np.linalg.norm( signal )**2 noise_variance = signal_power/np.power(10,(SNR/10)) noise = np.sqrt(noise_variance)*noise + 0
這里實(shí)際上是有問(wèn)題的,我一開(kāi)始也沒(méi)發(fā)現(xiàn)。因?yàn)楫a(chǎn)生分布為N(mean,std**2)的噪聲我們用的公式是:
noise = std * N(0,1) + mean
換句話說(shuō),我們需要計(jì)算噪聲的std 以及 mean 。
計(jì)算噪聲的 std 時(shí),需要先計(jì)算信號(hào)的 std,然后利用SNR來(lái)求出噪聲的 std ,從上面的代碼中能發(fā)現(xiàn),signal_power 代表的是信號(hào)的std^2 與 signal.size 的乘積,多乘了一個(gè)signal.size 那結(jié)果肯定是有問(wèn)題的。
python批量給圖形添加噪聲
python代碼實(shí)現(xiàn)批量給圖形添加高斯噪聲和椒鹽噪聲
高斯噪聲
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 # 讀取函數(shù),用來(lái)讀取文件夾中的所有函數(shù),輸入?yún)?shù)是文件名 def read_directory(directory_name): ? ? for filename in os.listdir(directory_name): ? ? ? ? print(filename) ?# 僅僅是為了測(cè)試 ? ? ? ? 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")#這里傳入所要讀取文件夾的絕對(duì)路徑,加引號(hào)(引號(hào)不能省略?。?/pre>
椒鹽噪聲
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 # 讀取函數(shù),用來(lái)讀取文件夾中的所有函數(shù),輸入?yún)?shù)是文件名 def read_directory(directory_name): ? ? for filename in os.listdir(directory_name): ? ? ? ? print(filename) ?# 僅僅是為了測(cè)試 ? ? ? ? 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")#這里傳入所要讀取文件夾的絕對(duì)路徑,加引號(hào)(引號(hào)不能省略!)
隨機(jī)噪聲
import cv2 import os import numpy as np def random_noise(image,noise_num): ? ? ''' ? ? 添加隨機(jī)噪點(diǎn)(實(shí)際上就是隨機(jī)在圖像上將像素點(diǎn)的灰度值變?yōu)?55即白色) ? ? param image: 需要加噪的圖片 ? ? param noise_num: 添加的噪音點(diǎn)數(shù)目 ? ? return: img_noise ? ? ''' ? ? # 參數(shù)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)#隨機(jī)生成指定范圍的整數(shù) ? ? ? ? y = np.random.randint(0, cols) ? ? ? ? img_noise[x, y, :] = 255 ? ? return img_noise # 讀取函數(shù),用來(lái)讀取文件夾中的所有函數(shù),輸入?yún)?shù)是文件名 def read_directory(directory_name): ? ? for filename in os.listdir(directory_name): ? ? ? ? print(filename) ?# 僅僅是為了測(cè)試 ? ? ? ? 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")#這里傳入所要讀取文件夾的絕對(duì)路徑,加引號(hào)(引號(hào)不能省略?。?/pre>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python Django連接MySQL數(shù)據(jù)庫(kù)做增刪改查
本文寫(xiě)的是python Django連接MySQL數(shù)據(jù)庫(kù)的步驟,提供增刪改查的代碼2013-11-11Python中使用format函數(shù)的小結(jié)
在Python中,format()函數(shù)是一種用于格式化字符串的方法主要介紹了Python中使用format函數(shù)的小結(jié),本文就來(lái)介紹一下format()函數(shù)的使用示例,感興趣的可以了解一下2023-08-08Python中標(biāo)準(zhǔn)模塊importlib詳解
這篇文章主要給大家詳細(xì)介紹了Python中標(biāo)準(zhǔn)模塊importlib的使用方法和示例,非常簡(jiǎn)單,有需要的小伙伴可以參考下2017-04-04Python開(kāi)發(fā)的實(shí)用計(jì)算器完整實(shí)例
這篇文章主要介紹了Python開(kāi)發(fā)的實(shí)用計(jì)算器,結(jié)合完整實(shí)例形式分析了Python實(shí)現(xiàn)計(jì)算器四則運(yùn)算、開(kāi)方、取余等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05使用Pandas實(shí)現(xiàn)清洗客戶編碼異常數(shù)據(jù)
在不同行業(yè)中,我們經(jīng)常會(huì)遇到一個(gè)麻煩的問(wèn)題:數(shù)據(jù)清洗,尤其是當(dāng)我們需要處理客戶編碼異常數(shù)據(jù)時(shí),下面小編就來(lái)和大家分享一下常用的解決辦法吧2023-07-07