设计一种能够滤除所有噪声而保持所有重要的图像结构特征完整的滤波器是不可能的,因为没有哪种滤波器能够很好地辨别图像中的哪部分内容对观测者比较重要,哪部分内容不那么重要。中值滤波在这方面做的较好。

 

中值滤波:将图像中每一点的像素值由对应滤波区域内像素值的中值代替,也就是说,如果将像素点对应的滤波区域内的像素值按升序排列,那么如果整个区域有奇数个像素,则以中间的像素值为中值,如果整个区域内有偶数个像素值,则中值为中间两个像素的平均值。

 

代码如下:

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);