讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 2.6 圖像的噪聲和濾波 >

2.6 圖像的噪聲和濾波

在數字圖像處理中,經常會遇到一些模糊、失真或者有干擾的圖像,這些造成圖像不清晰的因素就是圖像的噪聲。圖像的噪聲可分為加性噪聲、乘性噪聲和量化噪聲,常見的噪聲模型有高斯噪聲、椒鹽噪聲、均勻分佈噪聲、指數分佈噪聲和Gamma分佈噪聲。為了獲得清晰的、高質量的圖像,需要對有噪聲的圖像進行去噪,比較經典的去噪算法有均值濾波、自適應維納濾波、中值濾波、形態學噪聲濾波和小波濾波。本節主要對常見的噪聲模型和經典的去噪算法進行介紹。

2.6.1 常見的噪聲模型

1.高斯噪聲

高斯噪聲是一種源於電子電路噪聲和由低照明度或高溫帶來的傳感器噪聲。高斯噪聲是一種比較常見的噪聲,它的概率密度呈正態分佈。

在MATLAB中,函數imnoise可以對圖像添加高斯噪聲,有三種方式,格式如下。

第一種:

newimg=imnoise(img,』 gaussian』,m,v);

newimg是添加高斯噪聲後的圖像,img是原圖像,gaussian表示噪聲類型為高斯噪聲,m為噪聲的均值,v是噪聲的方差。m和v如果不設置,則使用系統默認參數。

第二種:

newimg=imnoise(img,』localvar』,V);

newimg是添加高斯噪聲後的圖像,img是原圖像,V是一個和img相同尺寸的數組,V中的每個元素表示在img對應位置添加的高斯噪聲的方差,此時高斯噪聲的均值為0。

第三種:

newimg=imnoise(img,』localvar』,h,v);

newimg是添加高斯噪聲後的圖像,img是原圖像,h是一個表示圖像亮度的向量,亮度值在[0,1]。v和h的長度相同,h的每個值表示和v對應位置的亮度上添加的高斯噪聲的方差。

下面我們通過Code25來說明如何在圖像上添加高斯噪聲。

Code25:ch2_25.m

運行Code25後,結果如圖2-37所示。該程序使用三種不同的方式添加高斯噪聲,圖(a)是原圖像,圖(b)是根據噪聲的均值和方差添加高斯噪聲後的圖像,圖(c)是根據像素位置添加高斯噪聲後的圖像,圖(d)是根據圖像的亮度添加高斯噪聲後的圖像。

圖2-37 Code25運行後的結果

2.椒鹽噪聲

椒鹽噪聲是一種只有兩種灰度值作為噪聲出現在圖像上的噪聲,因此也稱為雙極脈衝噪聲。負脈衝時黑點出現,正脈衝時鹽點(白點)出現。

去除椒鹽噪聲最常用的算法是中值濾波。

對圖像img添加噪聲,類型可以為:gaussian(高斯噪聲)、salt&pepper(椒鹽噪聲)、speckle(乘性噪聲)、poisson(泊松噪聲)。param是對應類型噪聲的參數,如果不設置,則使用系統默認的參數。

在MATLAB中,也可以使用函數imnoise產生椒鹽噪聲,格式如下。

newimg=imnoise(img,』salt & pepper』,d)

newimg是添加椒鹽噪聲後的圖像;img是原圖像;salt & pepper表示噪聲的類型為椒鹽噪聲;d為椒鹽噪聲的密度,表示椒鹽噪聲占圖像像素總分的百分比。

下面我們通過Code26來說明如何利用函數imnoise產生椒鹽噪聲。

Code26:ch2_26.m

運行Code26後,結果如圖2-38所示。圖(a)的噪聲密度為0.01,圖(b)的噪聲密度為0.08。從中可以看出,噪聲密度越大,噪聲越多。黑點代表胡椒點,白點代表鹽點。

圖2-38 Code26的運行結果

此外,函數imnoise還可以產生其他類型的噪聲,如乘性噪聲、泊松噪聲等,本書不多做介紹,讀者可查閱MATLAB幫助文檔進行學習。

2.6.2 經典的去噪算法

1.均值濾波

均值濾波是一種簡單的去噪方法,對於圖像中的坐標為(x,y)的像素,以該點為中心創建一個矩形框,計算該矩形框中像素的平均值,用得到的平均值替換像素點(x,y)的值。在MATLAB中,可以通過函數fspecial(\'average\')得到均值濾波算子,然後利用函數imfilter對含噪聲的圖像進行濾波。

下面我們通過程序Code27來說明如何利用函數fspecial和函數imfilter對包含噪聲的圖像進行均值濾波。

Code27:ch2_27.m

運行Code27後,結果如圖2-39所示。可以看到,進行均值濾波後的圖像變得模糊,這是因為均值濾波破壞了圖像的細節部分,這也是均值濾波的一個缺點。

圖2-39 Code27的運行結果

2.自適應維納濾波

在MATLAB中,函數wiener2可以對含噪聲的圖片進行自適應維納濾波,還可以估計噪聲。該函數由圖像的局部方差決定濾波器的輸出結果,使用格式如下。

newimg=wiener2(img,[m,n],noise);

img是包含噪聲的圖像;[m,n]是採用的窗口大小,默認為[3,3];noise是噪聲的能量;newimg是濾波後的圖像。

[newimg,noise]=wiener2(img,[m,n])

該函數用來估計圖像中的噪聲。

下面我們通過Code28來說明如何對包含噪聲的圖像進行自適應維納濾波。

Code28:ch2_28.m

運行Code28後,結果如圖2-40所示。在工作空間中,查看noise的值,即估計的噪聲能量,noise=0.0124。

圖2-40 Code28的運行結果

3.中值濾波

中值濾波是順序統計濾波中的一種,順序統計濾波中還有最小值濾波、最大值濾波。中值濾波適合去除椒鹽噪聲,因為它可以保留圖像的邊緣。對於圖像上坐標為(x,y)的像素,以該像素為中心的一個m×n像素的窗口,找出該區域內中間的像素值,用於替換點(x,y)的像素值。在MATLAB中,函數medfilt2可實現圖像的二維中值濾波,格式如下。

newimg=medfilt2(img,[m,n]);

img是含噪聲的圖像;newimg是濾波後的圖像;[m,n]是窗口的大小,默認為[3,3]。

下面我們通過Code29來說明如何利用函數medfilt2對含噪聲的圖像進行濾波。

Code29:ch2_29.m

運行Code29,結果如圖2-41所示。由圖2-41(a)和(b)可以看出,中值濾波對於含椒鹽噪聲的圖像去噪效果較好。

圖2-41 Code29的運行結果