MATLAB自适应中值滤波代码

最近数字图像处理课程课后作业,要求自己用代码实现自适应中值滤波器,虽然很简单,但是在网上找了一圈也没有可以直接拿来用的,所以就在网上找了一段代码,并且自己改了一下,能够实现效果了,虽然效率不是很高,但是能用,希望有需要的人也可以拿去用


代码

一共三段代码,主函数以及两个方法

  1. 主函数
    img_rgb = imread('D:\1.jpg');
    img_gray = rgb2gray(img_rgb);
    imshow(img_gray);
    title('原图');
    figure();
    imshow(img_gray);
    img_salt = imnoise(img_gray,'salt & pepper',0.4);
    imshow(img_salt);
    title('加入0.4椒盐噪声');
    figure();
    img_gaussian = imnoise(img_gray,'gaussian',0.3);
    imshow(img_gaussian);
    title('加入0.3高斯噪声');
    figure();
    imshow(medfilt2(img_salt),[3,3]);
    title('中值滤波处理椒盐噪声图像');
    figure();
    imshow(medfilt2(img_gaussian,[3,3]));
    title('中值滤波处理高斯噪声图像');
    figure();
    imshow(RAMF(img_salt,3));
    title('椒盐噪声图像自适应中值滤波后图片');
    figure();
    imshow(RAMF(img_gaussian,4));
    title('高斯噪声图像自适应中值滤波后图片');

     

  2.  自适应中值滤波方法
    function img_RAMF = RAMF(img_noise, max)
    
    %获取图像的列数
    m=size(img_noise,1);
    %获取图像的列数
    n=size(img_noise,2);
    
    %确定最大的滤波半径
    Nmax=max;       
    
    %下面是边界扩展,图像上下左右各增加Nmax像素。
    imgn=zeros(m+2*Nmax,n+2*Nmax,'uint8');
    imgn(Nmax+1:m+Nmax,Nmax+1:n+Nmax)=img_noise;
    
    imgn(1:Nmax,Nmax+1:n+Nmax)=img_noise(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 = my_sort(W);
                W_size = size(W);
                Imin=W(1);
                Imax=W(W_size(1));
                Imed=W(ceil(W_size(1)/2));
                if Imin

     

  3. 排序方法
    function sort_data = my_sort(data)
    
    data_size = size(data);
    width = data_size(2);
    height = data_size(1);
    sort_data = data(:);
    
    data_length = width * height;
    for i = 1:data_length - 1
        for j = i + 1:data_length -1
            if sort_data(i) > sort_data(j)
                x = sort_data(i);
                sort_data(i) = sort_data(j);
                sort_data(j) = x;
            end
        end
    end

     

你可能感兴趣的:(matlab)