高斯噪声,椒盐噪声的思想及多种噪声的实现
圖像噪聲:
概念:
? 圖像噪聲是圖像在獲取或是傳輸過程中受到隨機信號干擾,妨礙人們對圖像理解及分析處理 的信號。
? 很多時候?qū)D像噪聲看做多維隨機過程,因而描述噪聲的方法完全可以借用隨機過程的描述, 也就是使用隨機過程的描述,也就是用它的高斯分布函數(shù)和概率密度分布函數(shù)。
? 圖像噪聲的產(chǎn)生來自圖像獲取中的環(huán)境條件和傳感元器件自身的質(zhì)量,圖像在傳輸過程中產(chǎn) 生圖像噪聲的主要因素是所用的傳輸信道受到了噪聲的污染。
信噪比:
在噪聲的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量圖像噪聲。
通俗的講就是信號占多少,噪聲占多少,SNR越小,噪聲占比越大。 在信號系統(tǒng)中,計量單位為dB,為10lg(PS/PN), PS和PN分別代表信號和噪聲的有效功率。 在這里,采用信號像素點的占比充當(dāng)SNR,以衡量所添加噪聲的多少。
舉個例,假設(shè)一張圖像的寬x高 = 10x10 ,共計100個像素,想讓其中20個像素點變?yōu)樵肼?#xff0c;其余80 個像素點保留原值,則這里定義的SNR=80/100 = 0.8 。
高斯噪聲:
概念:
? 高斯噪聲(Gaussian noise)是指它的概率密度函數(shù)服從高斯分布的一類噪聲。
? 特別的,如果一個噪聲,它的幅度分布服從高斯分布,而它的功率譜密度又是均勻分布的,則稱 它為高斯白噪聲。
? 必須區(qū)分高斯噪聲和白噪聲兩個不同的概念。高斯噪聲是指噪聲的概率密度函數(shù)服從高斯分布, 白噪聲是指噪聲的任意兩個采樣樣本之間不相關(guān),兩者描述的角度不同。白噪聲不必服從高斯分 布,高斯分布的噪聲不一定是白噪聲。
產(chǎn)生原因:
1)圖像傳感器在拍攝時不夠明亮、亮度不夠均勻;
2)電路各元器件自身噪聲和相互影響;
3)圖像傳感器長期工作,溫度過高
實現(xiàn)方法:
一個正常的高斯采樣分布公式G(d), 得到輸出像素
*Pout. Pout = Pin + XMeans + sigma G(d)
其中d為一個線性的隨機數(shù),G(d)是隨機數(shù)的高斯分布隨機值。
給一副數(shù)字圖像加上高斯噪聲的處理順序如下:
a. 輸入?yún)?shù)sigma 和 X mean
b. 以系統(tǒng)時間為種子產(chǎn)生一個偽隨機數(shù)
c. 將偽隨機數(shù)帶入G(d)得到高斯隨機數(shù)
d. 根據(jù)輸入像素計算出輸出像素
e. 重新將像素值放縮在[0 ~ 255]之間 f. 循環(huán)所有像素
g. 輸出圖像
手動代碼實現(xiàn):
#隨機生成符合正態(tài)(高斯)分布的隨機數(shù),means,sigma為兩個參數(shù) import numpy as np import cv2 from numpy import shape import random def GaussianNoise(src,means,sigma,percetage): #means是均值,percetage是信噪比NoiseImg=srcNoiseNum=int(percetage*src.shape[0]*src.shape[1])for i in range(NoiseNum):#每次取一個隨機點#把一張圖片的像素用行和列表示的話,randX 代表隨機生成的行,randY代表隨機生成的列#random.randint生成隨機整數(shù)#高斯噪聲圖片邊緣不處理,故-1randX=random.randint(0,src.shape[0]-1)randY=random.randint(0,src.shape[1]-1)#此處在原有像素灰度值上加上隨機數(shù)NoiseImg[randX,randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)#若灰度值小于0則強制為0,若灰度值大于255則強制為255if NoiseImg[randX, randY]< 0:NoiseImg[randX, randY]=0elif NoiseImg[randX, randY]>255:NoiseImg[randX, randY]=255return NoiseImg img = cv2.imread('lenna.png',0) img1 = GaussianNoise(img,2,4,0.5) img = cv2.imread('lenna.png') img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #cv2.imwrite('lenna_GaussianNoise.png',img1) cv2.imshow('source',img2) cv2.imshow('lenna_GaussianNoise',img1) cv2.waitKey(0)實現(xiàn)結(jié)果展示:
椒鹽噪聲
椒鹽噪聲概念:
? 椒鹽噪聲又稱為脈沖噪聲,它是一種隨機出現(xiàn)的白點或者黑點。
? 椒鹽噪聲 = 椒噪聲 (pepper noise)+ 鹽噪聲(salt noise)。 椒鹽噪聲的值為0(椒)或者255(鹽)。
? 前者是低灰度噪聲,后者屬于高灰度噪聲。一般兩種噪聲同時出現(xiàn),呈現(xiàn)在圖像上就是黑白雜點。
? 對于彩色圖像,也有可能表現(xiàn)為在單個像素BGR三個通道隨機出現(xiàn)的255或0。
? 如果通信時出錯,部分像素的值在傳輸時丟失,就會發(fā)生這種噪聲。
? 鹽和胡椒噪聲的成因可能是影像訊號受到突如其來的強烈干擾而產(chǎn)生等。例如失效的感應(yīng)器導(dǎo)致像 素值為最小值,飽和的感應(yīng)器導(dǎo)致像素值為最大值。
實現(xiàn)方法:
給一副數(shù)字圖像加上椒鹽噪聲的處理順序:
1.指定信噪比 SNR ,其取值范圍在[0, 1]之間
2.計算總像素數(shù)目 SP, 得到要加噪的像素數(shù)目 NP = SP * (1-SNR)
3.隨機獲取要加噪的每個像素位置P(i, j)
4.指定像素值為255或者0。
5.重復(fù)3, 4兩個步驟完成所有NP個像素的加噪
手動代碼實現(xiàn):
import numpy as np import cv2 #pip install opencv_python from numpy import shape import random def fun1(src,percetage): NoiseImg=src NoiseNum=int(percetage*src.shape[0]*src.shape[1]) for i in range(NoiseNum): #返還一個迭代器 #每次取一個隨機點 #把一張圖片的像素用行和列表示的話,randX 代表隨機生成的行,randY代表隨機生成的列#random.randint生成隨機整數(shù)#椒鹽噪聲圖片邊緣不處理,故-1randX=random.randint(0,src.shape[0]-1) randY=random.randint(0,src.shape[1]-1) #random.random生成隨機浮點數(shù),隨意取到一個像素點有一半的可能是白點255,一半的可能是黑點0 if random.random()<=0.5: NoiseImg[randX,randY]=0 else: NoiseImg[randX,randY]=255 return NoiseImg#導(dǎo)入圖片 img=cv2.imread('lenna.png',0)#調(diào)fun1函數(shù),0.2為參數(shù) img1=fun1(img,0.2) #在文件夾中寫入命名為lenna_PepperandSalt.png的加噪后的圖片 #cv2.imwrite('lenna_PepperandSalt.png',img1)img = cv2.imread('lenna.png') img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow('source',img2) cv2.imshow('lenna_PepperandSalt',img1) cv2.waitKey(0)實現(xiàn)結(jié)果展示:
其他多種噪聲:
概念:
泊松噪聲:
符合泊松分布的噪聲模型,泊松分布適合于描述單位時間內(nèi)隨機事件發(fā)生的次數(shù)的概率分布。 如某一服務(wù)設(shè)施在一定時間內(nèi)受到的服務(wù)請求的次數(shù),電話交換機接到呼叫的次數(shù)、汽車站臺的候客人 數(shù)、機器出現(xiàn)的故障數(shù)、自然災(zāi)害發(fā)生的次數(shù)、DNA序列的變異數(shù)、放射性原子核的衰變數(shù)等等。
乘性噪聲:
一般由信道不理想引起,它們與信號的關(guān)系是相乘,信號在它在,信號不在他也就不在。
瑞利噪聲:
相比高斯噪聲而言,其形狀向右歪斜,這對于擬合某些歪斜直方圖噪聲很有用。瑞利噪聲的 實現(xiàn)可以借由平均噪聲來實現(xiàn)。
伽馬噪聲:
其分布服從了伽馬曲線的分布。伽馬噪聲的實現(xiàn),需要使用b個服從指數(shù)分布的噪聲疊加而 來。指數(shù)分布的噪聲,可以使用均勻分布來實現(xiàn)。(b=1時為指數(shù)噪聲,b>1時通過若干個指數(shù)噪聲疊 加,得到伽馬噪聲)
多種噪聲接口代碼實現(xiàn):
import cv2 as cv import numpy as np from PIL import Image from skimage import util''' def random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs): 功能:為浮點型圖片添加各種隨機噪聲 參數(shù): image:輸入圖片(將會被轉(zhuǎn)換成浮點型),ndarray型 mode: 可選擇,str型,表示要添加的噪聲類型gaussian:高斯噪聲localvar:高斯分布的加性噪聲,在“圖像”的每個點處具有指定的局部方差。poisson:泊松噪聲salt:鹽噪聲,隨機將像素值變成1pepper:椒噪聲,隨機將像素值變成0或-1,取決于矩陣的值是否帶符號s&p:椒鹽噪聲speckle:均勻噪聲(均值mean方差variance),out=image+n*image seed: 可選的,int型,如果選擇的話,在生成噪聲前會先設(shè)置隨機種子以避免偽隨機 clip: 可選的,bool型,如果是True,在添加均值,泊松以及高斯噪聲后,會將圖片的數(shù)據(jù)裁剪到合適范圍內(nèi)。如果誰False,則輸出矩陣的值可能會超出[-1,1] mean: 可選的,float型,高斯噪聲和均值噪聲中的mean參數(shù),默認值=0 var: 可選的,float型,高斯噪聲和均值噪聲中的方差,默認值=0.01(注:不是標(biāo)準(zhǔn)差) local_vars:可選的,ndarry型,用于定義每個像素點的局部方差,在localvar中使用 amount: 可選的,float型,是椒鹽噪聲所占比例,默認值=0.05 salt_vs_pepper:可選的,float型,椒鹽噪聲中椒鹽比例,值越大表示鹽噪聲越多,默認值=0.5,即椒鹽等量 -------- 返回值:ndarry型,且值在[0,1]或者[-1,1]之間,取決于是否是有符號數(shù) '''img = cv.imread("lenna.png") noise_gs_img=util.random_noise(img,mode='gaussian') #自由選擇想要的噪聲cv.imshow("source", img) cv.imshow("lenna",noise_gs_img) #cv.imwrite('lenna_noise.png',noise_gs_img) cv.waitKey(0) cv.destroyAllWindows()根據(jù)mode的不同,可自由實現(xiàn)多種噪聲~
總結(jié)
以上是生活随笔為你收集整理的高斯噪声,椒盐噪声的思想及多种噪声的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到别人考试失利怎么回事
- 下一篇: opencv:图像读取BGR变成RGB