自適應中值濾波及matlab實現

2021-08-10 15:06:27 字數 2653 閱讀 4235

常規的中值濾波器,在雜訊的密度不是很大的情況下(根據經驗,雜訊的出現的概率小於0.2),效果不錯。但是當概率出現的概率較高時,常規的中值濾波處理後,仍然具有雜訊點,並丟失了細節和邊緣,效果不是很好。

在模板視窗sxy定義的濾波器區域內定義如下變數:

zmin=min(sxy),模板視窗sxy中的最小灰度值

zmax=max(sxy),模板視窗sxy中的最大灰度值

zmed=med(sxy),模板視窗sxy中的灰度值的中值

zxy,座標(x,y)處的灰度值

smax,sxy允許的最大尺寸

程序a:

a1=zmed-zmin

a2=zmed-zmax

如果a1>0且a2<0,則轉至程序b

否則增大視窗尺寸

如果視窗尺寸<=smax,則重複程序a

否則輸出zmed

程序b:

b1=zxy-zmin

b2=zxy-zmax

如果b1>0且b2<0,則輸出zxy

否則輸出zmed

可以看到,步驟中是對每個模板依次比較的,但是在matlab中更方便直接用矩陣對整體運算。

這裡有兩個前提函式:

ordfilt2()%二維統計順序濾波函式

medfilt2()%中值濾波

在matlab影象處理工具箱中提供了二維統計順序濾波函式ordfilt2函式。二維統計順序濾波是中值濾波的推廣,對於給定的n個數值{al ,a2,...,an},將它們按大小順序排列,將處於第k個位置的元素作為影象濾波輸出,即序號為k的二維統計濾波。ordfilt2函式語法格式為:

y=ordfilt2(x,order,domain)

y=ordfilt2(x,order,domain,s)

其功能是:對影象x作順序統計濾波,order為濾波器輸出的順序值,domain為濾波視窗。s是與domain大小相同的矩陣,它是對應domain中非零值位置的輸出偏置,這在圖形形態學中是很有用的。例如:

y=ordfilt2(x,5,ones(3,3)),相當於3×3的中值濾波

y=ordfilt2(x,1,ones(3,3)),相當於3×3的最小值濾波

y=ordfilt2(x,9,ones(3,3)),相當於3×3的最大值濾波

function ii=adp_median(i,smax)

%自適應中值濾波

if (smax<=1)||(smax/2==round(smax/2))||(smax~=round(smax))%smax約束,雜訊密度越大,smax應當設定越高

error('smax must be an odd integer >1');

end%初始化

ii=i;

ii(:)=0;

alreadyprocessed=false(size(i));

%迭代for k=3:2:smax

zmin=ordfilt2(i,1,ones(k,k),'symmetric');

zmax=ordfilt2(i,k*k,ones(k,k),'symmetric');

zmed=medfilt2(i,[k k],'symmetric');

processusinglevelb=(zmed>zmin)&(zmax>zmed)&(~alreadyprocessed);%需要轉到b步驟的畫素

zb=(i>zmin)&(zmax>i);

outputzxy=processusinglevelb&zb;%滿足步驟a,b的輸出原值 對應的畫素位置

outputzmed=processusinglevelb&~zb;%滿足a,不滿足b的輸出中值 對應的畫素位置

ii(outputzxy)=i(outputzxy);

ii(outputzmed)=zmed(outputzmed);

alreadyprocessed=alreadyprocessed|processusinglevelb;%處理過的畫素

if all(alreadyprocessed(:))

break;

endend

ii(~alreadyprocessed)=i(~alreadyprocessed);%超過視窗大小沒被處理的畫素位置 輸出原值

i=imread('cameraman.tif'); 

if=imnoise(i,'salt & pepper',0.4);

f2=medfilt2(if,[3,3]);%中值濾波後的影象

ff=adp_median(if,19);

subplot(2,2,1);

imshow(i);

title('原圖');

subplot(2,2,2);

imshow(if);

title('椒鹽雜訊汙染後的影象');

subplot(2,2,3);

imshow(f2);

title('中值濾波');

subplot(2,2,4);

imshow(ff);

title('自適應中值濾波'); ```

效果:![這裡寫描述](

自適應中值濾波

演算法 自適應中值濾波 layer a a1 zmed zmin a2 zmax zmed if a1 0 and a2 0,goto layer b else enlarge sxy,goto layer a if sxy exceeds the boundary,out zxy layer b ...

matlab練習程式(自適應中值濾波RAMF)

中值濾波是很經典的演算法了。今天看 又知道還有一種叫自適應中值濾波的演算法ramf。原 在這裡。ramf主要通過以下兩步來處理影象。1.首先確定最大的濾波半徑,然後用乙個合適的半徑r對影象進行濾波。計算當前濾波半徑畫素灰度的imin,imax,imed,然後判斷imed是否在 imin,imax 中...

RAMF自適應中值濾波

clear all 清除所有變數 close all 關閉所有開啟的檔案 clc 清除命令列內容 img mat2gray rgb2gray imread lena.jpg 讀取檔案 m n size img img imnoise img,salt pepper 0.25 加入椒鹽雜訊 subpl...