1. 程式人生 > >matlab中使用小波變換進行影象去噪

matlab中使用小波變換進行影象去噪

1:基於小波變換摸極大值原理

2:基於小波變換系數的相關性

3:基於小波閾值的去噪。

基於小波閾值的去噪方法3個步驟:

1: 計算含噪聲影象的小波變換。選擇合適的小波基和小波分解層數J,運用Matlab 分解演算法將含有噪聲影象進行J層小波分解,得到相應的小波分解係數。

2:對分解後的高頻係數進行閾值量化,對於從1 到J的每一層,選擇一個適當的閾值和合適的閾值函式,將分解得到的高頻係數進行閾值量化,得到估計小波係數。

3:進行小波逆變化,根據影象小波分解後的第J層,低頻 係數(尺度係數)和經過閾值量化處理的各層高頻係數(小波係數),運用Matlab重構演算法進行小波重構,得到去噪後的影象。

相關函式:

wavedec-----就是小波分解,將一個訊號分解成指定層數n,並返回各層的小波係數
waverec——它的作用與wavedec相反,即將給定的小波係數一次性完全重建出訊號。
wrcoef——這個也是輸入小波係數,重建訊號,但是它與上面有些區別,區別在於它重建的是原訊號在指定層次的,高頻或者低頻分量。
也就是說,這個訊號不是原本的訊號,而且某個層次上的逼近。

Talk is simple,Show me the code!

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear;                   
  
[X,map]=imread('lena.BMP');              
  
%X=rgb2gray(X);  


figure(1); 
  
        
set(gcf,'Position',[0,0,512,512])
set(gca,'position',[0 0 1 1])
imshow(X); 
%title('原始影象');                    
  
% 生成含噪影象並圖示  
  
init=2055615866;         
  
randn('seed',init);        
  
X=double(X);  
  
% 新增隨機噪聲  
  
XX=X+8*randn(size(X));    
  
figure(2) ;         
set(gcf,'Position',[0,0,512,512]);
set(gca,'position',[0 0 1 1])  ;
imshow(uint8(XX));                
 
%title(' 含噪影象 ');         
  
%用小波函式coif2對影象XX進行2層  
  
% 分解  
  
[c,l]=wavedec2(XX,2,'coif2');   
a2 = wrcoef2('a',c,l,'coif2',2);  % 重構第2層影象的近似係數


n=[1,2];        % 設定尺度向量  
              
p=[10.28,24.08];% 設定閾值向量 


nc=wthcoef2('h',c,l,n,p,'s');     %對高頻小波係數進行閾值處理
  
% 影象的二維小波重構  
  
X1=waverec2(nc,l,'coif2');    %影象的二維小波重構
  
figure(3)             ;   % 顯示影象處理之後的結果
set(gcf,'Position',[0,0,512,512]);
set(gca,'position',[0 0 1 1]);
imshow(uint8(X1));                  


             
%title(' 第一次消噪後的影象 ');   
mc=wthcoef2('v',nc,l,n,p,'s');    %再次對高頻小波係數進行閾值處理  
% 影象的二維小波重構  
  
X2=waverec2(mc,l,'coif2');    
figure(4);
set(gcf,'Position',[0,0,512,512]);
set(gca,'position',[0 0 1 1]);
imshow(uint8(X2));                  
%title(' 第二次消噪後的影象 ');


figure(5);
colormap(map); 
set(gcf,'Position',[0,0,512,512]);
set(gca,'position',[0 0 1 1]);
image(uint8(a2));
%title('原圖經過兩次低通濾波後的結果')
  
%信噪比 
Ps =sum(sum((X-mean(mean(X))).^2));
Pn =sum(sum((X2-X).^2));
SNR1 = 10*log10(Ps/Pn);
Pn1 = sum(sum(a2-X).^2);


SNR2 = 10*log10(Ps/Pn1);








%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
上面提供了兩種方法,一種是基於小波分解,即先利用函式wavedec2()對影象進行2層小波分解,再利用函式wrcoef()直接提取第二層的近似係數a2,根據小波分解的濾波器特性,a2即 是原影象經過兩次低通濾波後的結果。

第二種是基於小波閾值去噪,利用wthcoef2()對影象進行兩次高頻係數進行閾值去噪,再通過waverec2()實現影象的重構。

根據SNR結果,和圖片去噪畫面可知道小波閾值去噪的結果會更好點。


此外使用不同的母小波進行小波閾值去噪,也能得到不同的去噪效果。