中值濾波是很經典的演算法了。今天看**又知道還有一種叫自適應中值濾波的演算法ramf。原**在這裡。
ramf主要通過以下兩步來處理影象。
1.首先確定最大的濾波半徑,然後用乙個合適的半徑r對影象進行濾波。計算當前濾波半徑畫素灰度的imin,imax,imed,然後判斷imed是否在[imin,imax]中間,如果在則向下進行,否則擴大當前半徑r繼續濾波直到r等於最大濾波半徑。
2.如果當前處理的畫素img(i,j)在[imin,imax]之間,則輸出當前畫素,否則輸出當前濾波半徑中值畫素imed。
看下效果吧:
雜訊影象:
ramf演算法:
普通3*3中值濾波:
matlab**如下:
); %加入椒鹽雜訊
imshow(img,);
nmax=10
; %確定最大的濾波半徑
%下面是邊界擴充套件,影象上下左右各增加nmax畫素。
imgn=zeros(m+2*nmax+1,n+2*nmax+1
);imgn(nmax+1:m+nmax,nmax+1:n+nmax)=img;
imgn(
1:nmax,nmax+1:n+nmax)=img(1:nmax,1
:n); %擴充套件上邊界
imgn(
1:m+nmax,n+nmax+1:n+2*nmax+1)=imgn(1:m+nmax,n:n+nmax); %擴充套件右邊界
imgn(m+nmax+1:m+2*nmax+1,nmax+1:n+2*nmax+1)=imgn(m:m+nmax,nmax+1:n+2*nmax+1
); %擴充套件下邊界
imgn(
1:m+2*nmax+1,1:nmax)=imgn(1:m+2*nmax+1,nmax+1:2*nmax); %擴充套件左邊界
re=imgn;
for i=nmax+1:m+nmax
for j=nmax+1:n+nmax
r=1; %初始濾波半徑
while r~=nmax
w=imgn(i-r:i+r,j-r:j+r);
w=sort(w);
imin=min(w(:));
imax=max(w(:));
imed=w(uint8((2*r+1)^2/2
));
if iminimax %如果當前鄰域中值不是雜訊點,那麼就用此次的鄰域
break
;
else
r=r+1
; %否則擴大視窗,繼續判斷
endend
if iminimax %如果當前這個畫素不是雜訊,原值輸出
re(i,j)=imgn(i,j);
else
%否則輸出鄰域中值
re(i,j)=imed;
endend
endfigure;
imshow(re(nmax+1:m+nmax,nmax+1:n+nmax),);
自適應中值濾波及matlab實現
常規的中值濾波器,在雜訊的密度不是很大的情況下 根據經驗,雜訊的出現的概率小於0.2 效果不錯。但是當概率出現的概率較高時,常規的中值濾波處理後,仍然具有雜訊點,並丟失了細節和邊緣,效果不是很好。在模板視窗sxy定義的濾波器區域內定義如下變數 zmin min sxy 模板視窗sxy中的最小灰度值 ...
自適應中值濾波
演算法 自適應中值濾波 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 ...
RAMF自適應中值濾波
clear all 清除所有變數 close all 關閉所有開啟的檔案 clc 清除命令列內容 img mat2gray rgb2gray imread lena.jpg 讀取檔案 m n size img img imnoise img,salt pepper 0.25 加入椒鹽雜訊 subpl...