常規的中值濾波器,在雜訊的密度不是很大的情況下(根據經驗,雜訊的出現的概率小於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...