設計一種能夠濾除所有噪聲而保持所有重要的圖像結構特徵完整的濾波器是不可能的,因爲沒有哪種濾波器能夠很好地辨別圖像中的哪部分內容對觀測者比較重要,哪部分內容不那麼重要。中值濾波在這方面做的較好。
中值濾波:將圖像中每一點的像素值由對應濾波區域內像素值的中值代替,也就是說,如果將像素點對應的濾波區域內的像素值按升序排列,那麼如果整個區域有奇數個像素,則以中間的像素值爲中值,如果整個區域內有偶數個像素值,則中值爲中間兩個像素的平均值。
代碼如下:
function zhong_zhi_lv_bo()
%中值濾波
ori_im = input('原圖像ori_im: ');
ori_im =imnoise(ori_im,'salt & pepper',0.04); %加椒鹽噪聲
figure;imshow(ori_im);
ori_im = double(ori_im);
[m,n] = size(ori_im);
N = 5;%模板的半徑
mo_ban = (2 * N + 1)^2;
LB_im = zeros(m,n);
tic;
for i = (N + 1):(m - N)
for j = (N + 1):(n - N)
shuzu = zeros(1,mo_ban);
%sum = 0;
i_3 = 1;
for i_2 = -N:N
for j_2 = -N:N
shuzu(1,i_3) = ori_im(i + i_2,j + j_2);%把模板的元素放在一個一維數組裏面
i_3 = i_3 + 1;
%sum = sum + ori_im(i + i_2,j + j_2);
end
end
%冒泡排序從小到大
for k = 1:mo_ban
flag = 1;
for h = 1:(mo_ban - k)
if shuzu(1,h) > shuzu(1,h + 1)
temp = shuzu(1,h);
shuzu(1,h) = shuzu(1,h + 1);
shuzu(1,h + 1) = temp;
flag = 0;
end
end
if flag == 1
break;
end
end
LB_im(i,j) = shuzu(1,(mo_ban-1)/2+1);
%jun_zhi = sum / (2*N + 1)^2;
% LB_im(i,j) = jun_zhi;%sum / ((2*N+1)^2);
end
end
toc;
LB_im = uint8(LB_im);
figure;imshow(LB_im);