中值滤波原理及matlab实现代码

一、基本原理

上述均值滤波虽然可以降低噪声,但是也会导致图像模糊。而中值滤波在一定条件下可以克服线性滤波带来的图像细节模糊的问题,它对处理椒盐噪声非常有效。
中值滤波通常采用一个含有奇数个点的滑动窗口,将窗口中各点的灰度值按照从小到大的顺序排列,用这个排列的中值来代替中心点的灰度值。常用的中值滤波窗口形状有线状、方形和圆形等。在该算法中,我采用的是方形的窗口。

二、实现步骤

(1)采用一个大小为m×n的滑动窗口;
(2)令窗口在图像中滑动,并将窗口中心与某像素重合;
(3)将窗口下方图像区域的灰度值按照从小到大的顺序排列;
(4)找出上述排列的中间值;
(5)将上述中间值赋予窗口中心对应的像素。

三、效果演示

(1)使用大小为3×3的窗口进行中值滤波;
中值滤波原理及matlab实现代码_第1张图片
(2)使用大小为5×5的窗口进行中值滤波;
中值滤波原理及matlab实现代码_第2张图片
(3)使用大小为15×15的窗口进行中值滤波;
中值滤波原理及matlab实现代码_第3张图片

四、matlab实现代码

%% 中值滤波,模板的大小可以改变
clear,close all
srcImg = imread('中值滤波用.tif');
a = 1;% 模板行数为2*a+1
b = 1;% 模板列数为2*b+1
dstImg = median_Filter(srcImg,a,b);
h = figure(1);
size = get(0,'ScreenSize');
set(h,'position',size)
subplot(121);
imshow(srcImg);
title('原始图像','fontsize',24);
subplot(122);
imshow(dstImg);
title(sprintf('中值滤波后的图像(窗口大小为%d×%d)',2*a+1,2*b+1),'fontsize',24);
%% 函数定义:排序并找到中值
function mid_value = rank(mat)
    mat = mat(:);
    len = length(mat);
    for i = 1:len
        min_index = i;
        for j = i+1:len
            if mat(j) < mat(min_index)
                min_index = j;
            end
        end
        if (min_index ~= i)
            temp = mat(i);
            mat(i) = mat(min_index);
            mat(min_index) = temp;
        end
    end
    mid_index = (len+1)/2;
    mid_value = mat(mid_index);
end
%% 函数定义:中值滤波函数
function dstImg = median_Filter(srcImg,a,b)
    srcImg = double(srcImg);% 注意
    [rows,cols] = size(srcImg);
    dstImg = srcImg;
    m = 2*a+1;
    n = 2*b+1;
    for i = 1:rows-m+1
        for j = 1:cols-n+1
            masked = srcImg(i:i+m-1,j:j+n-1);
            mid_value = rank(masked);
            dstImg(i+a,j+b) = mid_value;
        end
    end
    dstImg = uint8(dstImg);
end

你可能感兴趣的:(matlab,图像处理,计算机视觉)