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


中值濾波是很經典的算法了。今天看論文又知道還有一種叫自適應中值濾波的算法RAMF。原論文在這里

RAMF主要通過以下兩步來處理圖像。

1.首先確定最大的濾波半徑,然后用一個合適的半徑r對圖像進行濾波。計算當前濾波半徑像素灰度的Imin,Imax,Imed,然后判斷Imed是否在[Imin,Imax]中間,如果在則向下進行,否則擴大當前半徑r繼續濾波直到r等於最大濾波半徑。

2.如果當前處理的像素img(i,j)在[Imin,Imax]之間,則輸出當前像素,否則輸出當前濾波半徑中值像素Imed。

看下效果吧:

噪聲圖像:

RAMF算法:

普通3*3中值濾波:

matlab代碼如下:

clear all;
close all;
clc;

img=mat2gray(imread('lena.jpg'));
[m n]=size(img);

img=imnoise(img,'salt & pepper',0.1);   %加入椒鹽噪聲
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 Imin<Imed && Imed<Imax       %如果當前鄰域中值不是噪聲點,那么就用此次的鄰域
               break;
            else
                r=r+1;              %否則擴大窗口,繼續判斷
            end          
        end
        
        if Imin<imgn(i,j) && imgn(i,j)<Imax         %如果當前這個像素不是噪聲,原值輸出
            re(i,j)=imgn(i,j);
        else                                        %否則輸出鄰域中值
            re(i,j)=Imed;
        end
        
    end
end

figure;
imshow(re(Nmax+1:m+Nmax,Nmax+1:n+Nmax),[]);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM