【圖像處理】圖像噪聲去除實驗 用 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

實驗結果

學如逆水行舟,不進則退
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章