實現SNN(對稱近鄰平滑濾波器)的程式碼

NO IMAGE

要求:演算法實現為函式[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;