实现SNN(对称近邻平滑滤波器)的代码

要求:算法实现为函数[im]=SNN_denoise (I,N),其中I为读入的图像矩阵; N为模板大小参数(正方形模板,边长为:2*N+1)。

参考测试代码:I = imread('peppers.png');im = SNN_denoise(I,2);figure,imshow(im)

function [im]=SNN_denoise(I,N)
% I  = [1 3 2 3 2 1 2; 1 2 1 4 3 3 2; 1 10 2 3 4 4 2; 
%         5 2 6 18 8 7 3; 5 5 7 0 8 8 5; 5 6 7 8 9 9 8; 
%         4 5 6 8 8 6 7];
%  N=2;
 [m, n]=size(I);
 I = imnoise(I,'salt & pepper');
 figure,imshow(I);
 for i=N+1:m-N
     for j=N+1:n-N
        B = I(i-N:i+N,j-N:j+N);			%B为取N*N的模板
        A = reshape(B, 1, []);			%把B变成一维放到A中,一层for循环,主要是为了节约遍历时间
        for k=1:2*N*(N+1)				%取2*N*(N+1)个 对角线值接近I(i,j)的
            a = A(1,k);			%因为reshape,是把一列一列的放入A的第一行中
            i1 = mod(k, 2*N+1);	%a在模板中行的位置,模板始终由(1,1)开始
            j1 = fix(k/(2*N+1))+1;	%a在模板中列的位置,模板始终由(1,1)开始
            i2 = 2*(N+1)-i1;		%a的对角线,在模板中的位置
            j2 = 2*(N+1)-j1;		%a的对角线,在模板中的位置
            b = A(1,(2*N+1)*(j2-1)+i2);    %a的对角线在A的位置
            if(abs(a-I(i,j))>abs(b-I(i,j)))
                C(k,1) = b;
            else
                C(k,1) = a;
            end
        end
        I(i, j) = round(mean(C));
     end
 end
 im = I;


你可能感兴趣的:(图像处理)