實驗內容
實現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
實驗結果
學如逆水行舟,不進則退