【图像处理入门】图像去噪算法(KNN,SNN)

实现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

 

 

 

 

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值