1. 程式人生 > >非局域均值去噪

非局域均值去噪

http://www.cnblogs.com/luo-peng/p/4785922.html

非區域性均值(NL-means)是近年來提出的一項新型的去噪技術。該方法充分利用了影象中的冗餘資訊,在去噪的同時能最大程度地保持影象的細節特徵。基本思想是:當前畫素的估計值由影象中與它具有相似鄰域結構的畫素加權平均得到。

 理論上,該演算法需要在整個影象範圍內判斷畫素間的相似度,也就是說,每處理一個畫素點時,都要計算它與影象中所有畫素點間的相似度。但是考慮到效率問題,實現的時候,會設定兩個固定大小的視窗:搜尋視窗和鄰域視窗。鄰域視窗在搜尋視窗中滑動,根據鄰域間的相似性確定畫素的權值。

下圖是NL-means演算法執行過程,大視窗是以目標畫素

為中心的搜尋視窗,兩個灰色小視窗分別是以為中心的鄰域視窗。其中以為中心的鄰域視窗在搜尋視窗中滑動,通過計算兩個鄰域視窗間的相似程度為賦以權值 。

NL-means執行過程

設含噪聲影象為,去噪後的影象為中畫素點處的灰度值通過如下方式得到:

其中權值表示畫素點間的相似度,它的值由以為中心的矩形鄰域間的距離決定:

其中

為歸一化係數,為平滑引數,控制高斯函式的衰減程度。越大高斯函式變化越平緩,去噪水平越高,但同時也會導致影象越模糊。越小,邊緣細節成分保持得越多,但會殘留過多的噪聲點。的具體取值應當以影象中的噪聲水平為依據。

程式:

複製程式碼
close all;
clear all;
clc
I
=double(imread('lena.tif')); I=I+10*randn(size(I)); tic O1=NLmeans(I,2,5,10); toc imshow([I,O1],[]);
複製程式碼 複製程式碼
function DenoisedImg=NLmeans(I,ds,Ds,h)
%I:含噪聲影象
%ds:鄰域視窗半徑
%Ds:搜尋視窗半徑
%h:高斯函式平滑引數
%DenoisedImg:去噪影象
I=double(I);
[m,n]=size(I);
DenoisedImg=zeros(m,n);
PaddedImg = padarray(I,[ds,ds],'symmetric','
both'); kernel=ones(2*ds+1,2*ds+1); kernel=kernel./((2*ds+1)*(2*ds+1)); h2=h*h; for i=1:m for j=1:n i1=i+ds; j1=j+ds; W1=PaddedImg(i1-ds:i1+ds,j1-ds:j1+ds);%鄰域視窗1 wmax=0; average=0; sweight=0; %%搜尋視窗 rmin = max(i1-Ds,ds+1); rmax = min(i1+Ds,m+ds); smin = max(j1-Ds,ds+1); smax = min(j1+Ds,n+ds); for r=rmin:rmax for s=smin:smax if(r==i1&&s==j1) continue; end W2=PaddedImg(r-ds:r+ds,s-ds:s+ds);%鄰域視窗2 Dist2=sum(sum(kernel.*(W1-W2).*(W1-W2)));%鄰域間距離 w=exp(-Dist2/h2); if(w>wmax) wmax=w; end sweight=sweight+w; average=average+w*PaddedImg(r,s); end end average=average+wmax*PaddedImg(i1,j1);%自身取最大權值 sweight=sweight+wmax; DenoisedImg(i,j)=average/sweight; end end
複製程式碼

結果:

可以看出,NL-means去噪效果的確很好。但是該演算法的最大缺陷就是計算複雜度太高,程式非常耗時,導致該演算法不夠實用。上例中256*256的lena圖耗時高達33.913968s!!