【图像处理】图像噪声去除实验 用 matlab 实现KNN(K近邻平滑滤波器)和 SNN(对称近邻平滑滤波器)

实验内容

实现KNN(K近邻平滑滤波器)

算法实现为函数[im]=KNN_denoise (I,K,N),其中I为读入的图像矩阵;K为最近邻个数,N为模板大小参数(N*N)。

测试代码

im=imread('.\im\cameraman.tif');   
im_noise=imnoise(im,'salt & pepper');  %加入椒盐噪声
figure,imshow(im_noise),title('加入椒盐噪声图象'); 
N = 7; K=25;
[im_filered]=KNNFilter(im_noise,N,K);

实验所需图片

链接:https://pan.baidu.com/s/1LaxnZdLeY3LnKKv276E0pA
提取码:vk8y

实验源码

function [img] = KNNFilter(im_noise,N,K)

[h,l,c] = size(im_noise);  
Y = zeros(h,1);
n = floor(N/2);
im = double(im_noise);  %将图像转换为double,便于下方计算转换
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+n);
        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);  %转换为uint8图像编码
figure,imshow(img),title('KNN滤波图像');

实验结果

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

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

测试代码

im=imread('.\im\cameraman.tif');  %%mandi.tif'); 
im_noise=imnoise(im,'salt & pepper');  %加入椒盐噪声
figure,imshow(im_noise),title('加入噪声之后的图象');  
[im_filered]=SNNFilter(im_noise,2);

实验所需图片

链接:https://pan.baidu.com/s/1LaxnZdLeY3LnKKv276E0pA
提取码:vk8y

实验源码

function [im] = SNNFilter(im_noise,n)
[h,l,c] = size(im_noise); %通过size函数获取行列、颜色通道
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));  %取a0点
                a1 = double(im_noise(row,col)); %取a1点
                a2 = double(im_noise(2*i-row,2*j-col)); %取a2点
                if(abs(a1-a0)>abs(a2-a0))  %如果a1到a0的距离的绝对值大于a2到a0距离的绝对值
                    selected_a = a2;  %取a2点(距离最接近的点)
                else  %另外,如果a1到a0的距离的绝对值小于a2到a0距离的绝对值
                    selected_a = a1;  %取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);  %转换uint8图像编码
figure,imshow(img),title('SNN滤波图像'); %显示滤波后的图象
end

实验结果

学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 Vue爱好者 博客之星
不是只会写业务代码的前端开发攻城狮!博客网站:yangchaoyi.vip做限量版的自己,就这样安静地努力。一个还在苦学前端的小小Chocolate,我的博客主要分享前端、算法、大学课程笔记、平常遇到的bug、心得感悟体会,感谢您的访问,若喜欢可以关注一下~每一个清晨,记得鼓励自己。没有奇迹,只有你努力的轨迹;没有运气,只有你坚持的勇气!每一份坚持都是成功的累积,只要相信自己,总会遇到惊喜!座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值