实现KNN(K近邻平滑滤波器)的代码。
要求:
算法实现为函数[im]=KNNFilter (I,K,N),其中I为读入的图像矩阵;K为最近邻个数,N为模板大小参数(N*N)。
测试代码如下:
im=imread('cameraman.tif');
im_noise=imnoise(im,'salt & pepper'); %加入椒盐噪声
figure,imshow(im_noise),title('加入噪声之后的图象');
N = 7; K=25;
[im_filered]=KNNFilter(im_noise,N,K);
figure,imshow(im_filered),title('去噪之后的图象');
(代码复制到此处)
%测试代码 %%im=imread('C:\Users\surface\Desktop\tiantian.PNG'); %im_noise=imnoise(im,'salt & pepper'); %加入椒盐噪声 %figure,imshow(im_noise),title('加入椒盐噪声图象'); %N = 7; K=25; %%N=3,K=5; %[im_filered]=KNNFilter(im_noise,N,K); function [im_filered]=KNNFilter(im_noise,N,K) [h,l,c]=size(im_noise); Y =zeros(h,l); n=floor(N/2); im=double(im_noise); mid=floor((N*N)/2)+1; for i=n+1:h-n for j=n+1:l-n block=im(i-n:i+n,j-n:j+1); block_delt=abs(block-im(i,j)); block_delt_inline=block_delt(:); block_delt_inline(mid)=[]; [tmpSort,ind]=sort(block_delt_inline);%%排序 block_inline=block(:); block_inline(mid)=[]; knn=block_inline(ind(1:K));%取前k个点 Y(i,j)=mean(knn); end end img=uint8(Y); figure,imshow(img),title('KNN'); |
实现SNN(对称近邻平滑滤波器)的代码。
要求:
算法实现为函数[im]=SNNFilter (I,N),其中I为读入的图像矩阵; N为模板大小参数(正方形模板,边长为:2*N+1)。
测试代码如下:
im=imread('C:\Users\surface\Desktop\tiantian.PNG');
im_noise=imnoise(im,'salt & pepper'); %加入椒盐噪声
figure,imshow(im_noise),title('加入噪声之后的图象');
[im_filered]=SNNFilter(im_noise,2);
figure,imshow(im_filered),title('SNN滤波图像');
(代码复制到此处)
%测试代码 %im=imread('C:\Users\surface\Desktop\tiantian.PNG'); %im_noise=imnoise(im,'salt & pepper'); %加入椒盐噪声 %figure,imshow(im_noise),title('加入噪声之后的图象'); %[im_filered]=SNNFilter(im_noise,2); %figure,imshow(im_filered),title('SNN滤波图像'); function [im] = SNNFilter(im_noise,n) [h,l,c] = size(im_noise); %获取行列、颜色通道 Y = zeros(h,1);
for i=n+1:h-n for j=n+1:l-n tmp=[]; for row=i-n:i+n for col=j-n:j+n a0=double(im_noise(i,j)); a1=double(im_noise(row,col)); a2=double(im_noise(2*i-row,2*j-col)); if(abs(a1-a0)>abs(a2-a0)) %绝对值比较 selected_a=a2; %取a2点 else selected_a=a1; end if~(row==i&&col==j)%如果是中心点的情况 tmp=[tmp,selected_a]; end end end Y(i,j) = mean(tmp);%求出tmp矩阵的均值 end end img = uint8(Y); figure,imshow(img),title('SNN滤波图像'); end |