數字圖像去噪典型算法及matlab實現

圖像去噪是數字圖像處理中的重要環節和步驟。去噪效果的好壞直接影響到後續的圖像處理工作如圖像分割、邊緣檢測等。圖像信號在產生、傳輸過程中都可能會受到噪聲的污染,一般數字圖像系統中的常見噪聲主要有:高斯噪聲(主要由阻性元器件內部產生)、椒鹽噪聲(主要是圖像切割引起的黑圖像上的白點噪聲或光電轉換過程中產生的泊松噪聲)等;
目前比較經典的圖像去噪算法主要有以下三種:
均值濾波算法:也稱線性濾波,主要思想爲鄰域平均法,即用幾個像素灰度的平均值來代替每個像素的灰度。有效抑制加性噪聲,但容易引起圖像模糊,可以對其進行改進,主要避開對景物邊緣的平滑處理。
中值濾波:基於排序統計理論的一種能有效抑制噪聲的非線性平滑濾波信號處理技術。中值濾波的特點即是首先確定一個以某個像素爲中心點的鄰域,一般爲方形鄰域,也可以爲圓形、十字形等等,然後將鄰域中各像素的灰度值排序,取其中間值作爲中心像素灰度的新值,這裏領域被稱爲窗口,當窗口移動時,利用中值濾波可以對圖像進行平滑處理。其算法簡單,時間複雜度低,但其對點、線和尖頂多的圖像不宜採用中值濾波。很容易自適應化。
Wiener維納濾波:使原始圖像和其恢復圖像之間的均方誤差最小的復原方法,是一種自適應濾波器,根據局部方差來調整濾波器效果。對於去除高斯噪聲效果明顯。
實驗一:均值濾波對高斯噪聲的效果
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif');%讀取圖像 

J=imnoise(I,'gaussian',0,0.005);%加入均值爲0,方差爲0.005的高斯噪聲 

subplot(2,3,1);imshow(I); 

title('原始圖像'); 

subplot(2,3,2); imshow(J); 

title('加入高斯噪聲之後的圖像'); 

%採用MATLAB中的函數filter2對受噪聲干擾的圖像進行均值濾波 

K1=filter2(fspecial('average',3),J)/255; %模板尺寸爲3 

K2=filter2(fspecial('average',5),J)/255;% 模板尺寸爲5 

K3=filter2(fspecial('average',7),J)/255; %模板尺寸爲7 

K4= filter2(fspecial('average',9),J)/255; %模板尺寸爲9 

subplot(2,3,3);imshow(K1); 

title('改進後的圖像1'); 

subplot(2,3,4); imshow(K2); 

title('改進後的圖像2'); 

subplot(2,3,5);imshow(K3); 

title('改進後的圖像3'); 

subplot(2,3,6);imshow(K4); 

title('改進後的圖像4'); 

PSfilter2用法
fspecial函數用於創建預定義的濾波算子,其語法格式爲:
h = fspecial(type)
h = fspecial(type,parameters)
參數type制定算子類型,parameters指定相應的參數,具體格式爲:
type='average',爲均值濾波,參數爲n,代表模版尺寸,用向量表示,默認值爲[3,3]
type= 'gaussian',爲高斯低通濾波器,參數有兩個,n表示模版尺寸,默認值爲[3,3]sigma表示濾波器的標準差,單位爲像素,默認值爲
0.5
type= 'laplacian',爲拉普拉斯算子,參數爲alpha,用於控制拉普拉斯算子的形狀,取值範圍爲[0,1],默認值爲0.2
type= 'log',爲拉普拉斯高斯算子,參數有兩個,n表示模版尺寸,默認值爲[3,3]sigma爲濾波器的標準差,單位爲像素,默認值爲0.5
type= 'prewitt'
,爲prewitt算子,用於邊緣增強,無參數。
type= 'sobel',爲著名的sobel算子,用於邊緣提取,無參數。
type= 'unsharp',爲對比度增強濾波器,參數alpha用於控制濾波器的形狀,範圍爲[0,1],默認值爲0.2
運行效果見圖1
據我目測,使用均值濾波去噪(高斯噪聲)效果選用的鄰域半徑越大效果越好,當然其代價也會更大,另外確切的去噪效果的好壞還需要用SNR等數據來度量。
實驗二:二維自適應維納濾波對高斯噪聲的濾除效果
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); %讀取圖像 

J=imnoise(I,'gaussian',0,0.005); %加入均值爲0,方差爲0.005的高斯噪聲 

K2=wiener2(J,[3 3]); %對加噪圖像進行二維自適應維納濾波 

K2=wiener2(J,[5 5]); %對加噪圖像進行二維自適應維納濾波 

K2=wiener2(J,[7 7]); %對加噪圖像進行二維自適應維納濾波 

K2=wiener2(J,[9 9]); %對加噪圖像進行二維自適應維納濾波 

subplot(2,3,1);imshow(I); 

title('原始圖像'); 

subplot(2,3,2);imshow(J); 

title('加噪圖像'); 

subplot(2,3,3);imshow(K1); 

title('恢復圖像1'); 

subplot(2,3,4);imshow(K2); 

title('恢復圖像2'); 

subplot(2,3,5);imshow(K3); 

title('恢復圖像3'); 

subplot(2,3,6);imshow(K4); 

title('恢復圖像3'); 

PS維納濾波的兩個函數wiener2deconvwnr都能夠完成維納濾波的功能, deconvwnr強調圖象復原方面,wiener2強調圖象空間域銳化的作用,其中J=wiener2(I,[m,n])返回有噪聲圖像I經過wierner(維納)濾波後的圖像,[m,n]指定濾波器窗口大小爲m*n,默認值爲3*3J=wiener2(I,[m,n],noise)指定噪聲的功率,[J,noise]=wiener2(I,[m,n])在圖像濾波的同時,返回噪聲功率的估計值noise
imnoise的語法格式爲
J = imnoise(I,type)
J = imnoise(I,type,parameters)
其中J = imnoise(I,type)返回對原始圖像I添加典型噪聲的有噪圖像J
參數typeparameters用於確定噪聲的類型和相應的參數。
下面的命令是對圖像1.gif分別加入高斯噪聲、椒鹽噪聲和乘性噪聲,其結果如圖所示

實驗三:對加入椒鹽噪聲的圖像分別作均值、中值和維納濾波
I=imread(1.gif'); 
J1=imnoise(I,'gaussian',0,0.02); 
J2=imnoise(I,'salt & pepper',0.02); 
J3=imnoise(I,'speckle',0.02); 

運行效果見圖2 

I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

J=imnoise(I,'salt & pepper',0.02); 

%h=ones(3,3)/9;%產生3*3的全1數組 

%B=conv2(J,h);%卷積運算 

K2=filter2(fspecial('average',3),J)/255; %均值濾波模板尺寸爲3 

K= medfilt2(J);%採用二維中值濾波函數medfilt2對受椒鹽噪聲干擾的圖像濾波 

K1=wiener2(J,[3 3]); %對加噪圖像進行二維自適應維納濾波     

subplot(2,3,1);imshow(I); 

title('原始圖像'); 

subplot(2,3,2);imshow(J); 

title('加噪圖像'); 

subplot(2,3,3);imshow(K2); 

title('均值濾波後的圖像'); 

subplot(2,3,4);imshow(K); 

title('中值濾波後的圖像'); 

subplot(2,3,5);imshow(K1); 

title('維納濾波後的圖像'); 

PSMATLAB中提供了卷積運算的函數命令conv2,其語法格式爲:
C = conv2(A,B)
C = conv2(A,B)
返回矩陣AB的二維卷積C。若Ama×na的矩陣,Bmb×nb的矩陣,則C的大小爲(ma+mb+1)×(na+nb+1)
MATLAB圖像處理工具箱提供了基於卷積的圖象濾波函數filter2filter2的語法格式爲:
Y = filter2(h,X)
其中Y = filter2(h,X)返回圖像X經算子h濾波後的結果,默認返回圖像Y與輸入圖像X大小相同。例如:
其實filter2conv2是等價的。MATLAB在計算filter2時先將卷積核旋轉180度,再調用conv2函數進行計算。
Fspecial函數用於創建預定義的濾波算子,其語法格式爲:
h = fspecial(type)
h = fspecial(type,parameters)
參數type制定算子類型,parameters指定相應的參數,具體格式爲前文已有敘述。
ones產生全1數組,zeros產生全零數組。
ones(a,b)產生ab列全1數組
ones(a)產生aa列全1叔祖
運行效果見圖3
   通過圖3我們也可得出結論,即中值濾波對於去除椒鹽噪聲效果最好,而維納濾波去除效果則較差。中值濾波對於去除椒鹽噪聲效果明顯,是因爲椒鹽噪聲只在畫面上的部分點隨機出現,而中值濾波根據數據排序,將未被污染的點代替噪聲點的值的概率較大,所以抑制效果好。對點、線和尖頂較多的圖像不宜採用中值濾波,因爲一些細節點可能被當成噪聲點。
實驗四: 分別使用二維統計濾波對椒鹽噪聲和高斯噪聲進行濾波
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

J1=imnoise(I,'salt & pepper',0.004); 

subplot(2,3,1);imshow(I); 

title('原始圖像'); 

subplot(2,3,2);imshow(J1); 

title('加椒鹽噪聲後的圖像'); 

J= ordfilt2(J1,5,ones(3,4));% 進行二維統計順序過濾 

subplot(2,3,3);imshow(J); 

title('椒鹽噪聲濾波後的圖像'); 

J2=imnoise(I,'gaussian',0,0.004); 

subplot(2,3,4);imshow(J2); 

title('加高斯噪聲後的圖像'); 

J3= ordfilt2(J2,5,ones(3,4)); 

subplot(2,3,5);imshow(J3); 

title('高斯噪聲濾波後的圖像'); 

PS:
效果見圖4
 
PSMATLAB小波分析工具箱提供的用於圖像去噪的函數有wrcoef2wpdencmp,其語法格式分別爲:
X=wrcoef2(‘type’,C,S,’wname’)
[xd,treed,datad,perf0,perfl2]=wpdencmp(x,sorh,N,’wname’,crit,par,keepapp)
其中,X=wrcoef2(‘type’,C,S,’wname’)返回基於小波分解結構[C,S]的小波重構圖像X。參數“type”等於a表示重構近似係數;等於h表示重構水平細節係數;等於v表示重構垂直細節係數,等於d表示重構對角細節係數。
[xd,treed,datad,perf0,perfl2]=wpdencmp(x,sorh,N,’wname’,crit,par,keepapp)是通過小波包定限(閾值化),返回輸入信號或圖像X的除噪結果xd。輸入參數中,[treed,datad]爲xd的最佳小波包分解結構;perfl2perf0表示L^2復原和壓縮百分數;perf12=100*(xd的小波包係數向量範數/X的小波包係數向量範數) ^2Keepapp=1表示近似係數不能閾值化,否則可以閾值化;sorh=’s’爲軟閾值化,h爲硬閾值化。
 
實驗五:利用wrcoef2函數進行圖像去噪
其程序代碼如下:
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

J=imnoise(I,'gaussian',0,0.005); 

[c,l]=wavedec2(J,2,'sym4'); 

J1= wrcoef2('a',c,l,'sym4',1); 

J2= wrcoef2('a',c,l,'sym4',2); 

subplot(2,2,1);imshow(I); 

title('原始圖像'); 

subplot(2,2,2);imshow(J); 

title('含噪圖像'); 

subplot(2,2,3);imshow(J1,[]); 

title('第一次去噪圖像'); 

subplot(2,2,4);imshow(J2,[]); 

title('第二次去噪圖像'); 

運行結果如圖5
實驗六:利用wpdencmp函數進行圖像去噪
其程序代碼如下:
I=imread('C:\Documents and Settings\Administrator\桌面\1.gif'); 

I=im2double(I); 

subplot(2,2,1);imshow(I); 

title('原始圖像'); 

J=imnoise(I,'gaussian',0,0.05); 

subplot(2,2,2);imshow(J); 

title('含噪圖像'); 

thr=0.1;sorh='s'; 

crit='shannon'; 

keepapp=0; 

J1=wpdencmp(J,sorh,3,'sym4',crit,thr,keepapp); 

subplot(2,2,3);imshow(J1); 

title('全局閾值去噪圖像'); 

J2=medfilt2(J1); 

subplot(2,2,4);imshow(J2); 

title('第二次去噪圖像'); 

PS:MATLAB圖像處理工具箱中,提供了medfilt2函數用於實現中值濾波。
Medfilt2函數的語法格式爲:
B = medfilt2(A)       3×3的濾波窗口對圖像A進行中值濾波。
B = medfilt2(A,[m n])   用指定大小爲m×n的窗口對圖像A進行中值濾波。  
效果如圖6
發佈了59 篇原創文章 · 獲贊 13 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章