要求:算法实现为函数[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;