圖像噪聲:
概念:
? 圖像噪聲是圖像在獲取或是傳輸過程中受到隨機信號干擾,妨礙人們對圖像理解及分析處理 的信號。
? 很多時候將圖像噪聲看做多維隨機過程,因而描述噪聲的方法完全可以借用隨機過程的描述, 也就是使用隨機過程的描述,也就是用它的高斯分布函數和概率密度分布函數。
? 圖像噪聲的產生來自圖像獲取中的環境條件和傳感元器件自身的質量,圖像在傳輸過程中產 生圖像噪聲的主要因素是所用的傳輸信道受到了噪聲的污染。
信噪比:
在噪聲的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量圖像噪聲。
通俗的講就是信號占多少,噪聲占多少,SNR越小,噪聲占比越大。 在信號系統中,計量單位為dB,為10lg(PS/PN), PS和PN分別代表信號和噪聲的有效功率。 在這里,采用信號像素點的占比充當SNR,以衡量所添加噪聲的多少。
舉個例,假設一張圖像的寬x高 = 10x10 ,共計100個像素,想讓其中20個像素點變為噪聲,其余80 個像素點保留原值,則這里定義的SNR=80/100 = 0.8 。
高斯噪聲:
概念:
? 高斯噪聲(Gaussian noise)是指它的概率密度函數服從高斯分布的一類噪聲。
? 特別的,如果一個噪聲,它的幅度分布服從高斯分布,而它的功率譜密度又是均勻分布的,則稱 它為高斯白噪聲。
? 必須區分高斯噪聲和白噪聲兩個不同的概念。高斯噪聲是指噪聲的概率密度函數服從高斯分布, 白噪聲是指噪聲的任意兩個采樣樣本之間不相關,兩者描述的角度不同。白噪聲不必服從高斯分 布,高斯分布的噪聲不一定是白噪聲。
產生原因:
1)圖像傳感器在拍攝時不夠明亮、亮度不夠均勻;
2)電路各元器件自身噪聲和相互影響;
3)圖像傳感器長期工作,溫度過高
實現方法:
一個正常的高斯采樣分布公式G(d), 得到輸出像素
*Pout. Pout = Pin + XMeans + sigma G(d)
其中d為一個線性的隨機數,G(d)是隨機數的高斯分布隨機值。
給一副數字圖像加上高斯噪聲的處理順序如下:
a. 輸入參數sigma 和 X mean
b. 以系統時間為種子產生一個偽隨機數
c. 將偽隨機數帶入G(d)得到高斯隨機數
d. 根據輸入像素計算出輸出像素
e. 重新將像素值放縮在[0 ~ 255]之間 f. 循環所有像素
g. 輸出圖像
手動代碼實現:
#隨機生成符合正態(高斯)分布的隨機數,means,sigma為兩個參數
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生成隨機整數#高斯噪聲圖片邊緣不處理,故-1randX=random.randint(0,src.shape[0]-1)randY=random.randint(0,src.shape[1]-1)#此處在原有像素灰度值上加上隨機數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)
實現結果展示:
椒鹽噪聲
椒鹽噪聲概念:
? 椒鹽噪聲又稱為脈沖噪聲,它是一種隨機出現的白點或者黑點。
? 椒鹽噪聲 = 椒噪聲 (pepper noise)+ 鹽噪聲(salt noise)。 椒鹽噪聲的值為0(椒)或者255(鹽)。
? 前者是低灰度噪聲,后者屬于高灰度噪聲。一般兩種噪聲同時出現,呈現在圖像上就是黑白雜點。
? 對于彩色圖像,也有可能表現為在單個像素BGR三個通道隨機出現的255或0。
? 如果通信時出錯,部分像素的值在傳輸時丟失,就會發生這種噪聲。
? 鹽和胡椒噪聲的成因可能是影像訊號受到突如其來的強烈干擾而產生等。例如失效的感應器導致像 素值為最小值,飽和的感應器導致像素值為最大值。
實現方法:
給一副數字圖像加上椒鹽噪聲的處理順序:
1.指定信噪比 SNR ,其取值范圍在[0, 1]之間
2.計算總像素數目 SP, 得到要加噪的像素數目 NP = SP * (1-SNR)
3.隨機獲取要加噪的每個像素位置P(i, j)
4.指定像素值為255或者0。
5.重復3, 4兩個步驟完成所有NP個像素的加噪
手動代碼實現:
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生成隨機整數#椒鹽噪聲圖片邊緣不處理,故-1randX=random.randint(0,src.shape[0]-1) randY=random.randint(0,src.shape[1]-1) #random.random生成隨機浮點數,隨意取到一個像素點有一半的可能是白點255,一半的可能是黑點0 if random.random()<=0.5: NoiseImg[randX,randY]=0 else: NoiseImg[randX,randY]=255 return NoiseImg#導入圖片
img=cv2.imread('lenna.png',0)#調fun1函數,0.2為參數
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)
實現結果展示:
其他多種噪聲:
概念:
泊松噪聲:
符合泊松分布的噪聲模型,泊松分布適合于描述單位時間內隨機事件發生的次數的概率分布。 如某一服務設施在一定時間內受到的服務請求的次數,電話交換機接到呼叫的次數、汽車站臺的候客人 數、機器出現的故障數、自然災害發生的次數、DNA序列的變異數、放射性原子核的衰變數等等。
乘性噪聲:
一般由信道不理想引起,它們與信號的關系是相乘,信號在它在,信號不在他也就不在。
瑞利噪聲:
相比高斯噪聲而言,其形狀向右歪斜,這對于擬合某些歪斜直方圖噪聲很有用。瑞利噪聲的 實現可以借由平均噪聲來實現。
伽馬噪聲:
其分布服從了伽馬曲線的分布。伽馬噪聲的實現,需要使用b個服從指數分布的噪聲疊加而 來。指數分布的噪聲,可以使用均勻分布來實現。(b=1時為指數噪聲,b>1時通過若干個指數噪聲疊 加,得到伽馬噪聲)
多種噪聲接口代碼實現:
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):
功能:為浮點型圖片添加各種隨機噪聲
參數:
image:輸入圖片(將會被轉換成浮點型),ndarray型
mode: 可選擇,str型,表示要添加的噪聲類型gaussian:高斯噪聲localvar:高斯分布的加性噪聲,在“圖像”的每個點處具有指定的局部方差。poisson:泊松噪聲salt:鹽噪聲,隨機將像素值變成1pepper:椒噪聲,隨機將像素值變成0或-1,取決于矩陣的值是否帶符號s&p:椒鹽噪聲speckle:均勻噪聲(均值mean方差variance),out=image+n*image
seed: 可選的,int型,如果選擇的話,在生成噪聲前會先設置隨機種子以避免偽隨機
clip: 可選的,bool型,如果是True,在添加均值,泊松以及高斯噪聲后,會將圖片的數據裁剪到合適范圍內。如果誰False,則輸出矩陣的值可能會超出[-1,1]
mean: 可選的,float型,高斯噪聲和均值噪聲中的mean參數,默認值=0
var: 可選的,float型,高斯噪聲和均值噪聲中的方差,默認值=0.01(注:不是標準差)
local_vars:可選的,ndarry型,用于定義每個像素點的局部方差,在localvar中使用
amount: 可選的,float型,是椒鹽噪聲所占比例,默認值=0.05
salt_vs_pepper:可選的,float型,椒鹽噪聲中椒鹽比例,值越大表示鹽噪聲越多,默認值=0.5,即椒鹽等量
--------
返回值:ndarry型,且值在[0,1]或者[-1,1]之間,取決于是否是有符號數
'''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()
根據mode的不同,可自由實現多種噪聲~