实验内容
实现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);
实验所需图片
链接:/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-nfor j=n+1:l-nblock = 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); %求出均值endendimg = 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);
实验所需图片
链接:/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-nfor j=n+1:l-ntmp = [];for row = i-n:i+nfor col = j-n:j+na0 = 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点(距离最接近的点)endif~(row == i && col == j) tmp = [tmp,selected_a];endendendY(i,j) = mean(tmp); %求出tmp矩阵的均值endendimg = uint8(Y); %转换uint8图像编码figure,imshow(img),title('SNN滤波图像'); %显示滤波后的图象end
实验结果
学如逆水行舟,不进则退
【图像处理】图像噪声去除实验 用 matlab 实现KNN(K近邻平滑滤波器)和 SNN(对称近邻平滑滤波器)
如果觉得《【图像处理】图像噪声去除实验 用 matlab 实现KNN(K近邻平滑滤波器)和 SNN(对》对你有帮助,请点赞、收藏,并留下你的观点哦!