如何在MATLAB中用内核实现中值滤波器来平滑图像?

时间:2018-05-24 15:33:01

标签: matlab image-processing median noise-reduction

我不知道如何在MATLAB中使用滑动窗口(内核)实现中值滤波器。我需要知道实现的样子,所以我可以尝试实现BSE算法(块智能擦除),这与中值滤波器非常相似。我需要它来擦除一些黑白像素。我知道有medfilt2()函数,但我需要知道它是如何实现的。

BSE算法的工作原理如下:

BSE算法基于中值技术,取代其极值(黑色或白色)像素的周围像素的中值。

1)对于以测试像素为中心的NxN窗口,其中N通常为,并且应该建议更大的值。

2)如果f(i,j)= 0或f(i,j)= 255,则f(i,j)是必须估计的绝对极值像素;转到第3步。否则,f(i,j)的值不会改变;转到第4步。

3)当检测到极值像素时,其灰度等级被窗口的中值取代。

4)对下一个窗口重复该过程。

我理解的是我需要用一个条件来实现中值滤波器,以检查当前像素值是0还是255.如果是,我将该值更改为邻域像素的中值。

我不知道我是否足够清楚,但我需要一些帮助:)。

当前的BSE算法:

function [outimg] = medianfilt(img,sz)
green  = img(:,:,2);
[rows,cols] = size(green);    % get size of grayscale image
pad = sz-1; % padding to be added
nimg = zeros(rows+pad,cols+pad); % padded image
nimg(pad/2+1:rows+pad/2, pad/2+1:cols+pad/2) = green;
outimg = zeros(rows,cols);  % output / median filtered image
for x = pad/2 + 1 : cols + pad/2  % loop over columns
    for y = pad/2 + 1 : rows + pad/2   % loop over rows
        if nimg(y,x) == 0 || nimg(y,x) == 255
            win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
            outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
        else
            outimg(y-pad/2,x-pad/2) = nimg(y,x);
        end
        win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
        outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
    end
end
imshow(outimg);
end

2 个答案:

答案 0 :(得分:2)

您可以按如下方式实现中值过滤器:

function [outimg] = medianfilt(img,sz)
    [rows,cols] = size(img);    % get size of grayscale image
    pad = sz-1; % padding to be added
    nimg = zeros(rows+pad,cols+pad); % padded image
    nimg(pad/2+1:rows+pad/2, pad/2+1:cols+pad/2) = img;
    outimg = zeros(rows,cols);  % output / median filtered image
    for x = pad/2 + 1 : cols + pad/2  % loop over columns
        for y = pad/2 + 1 : rows + pad/2   % loop over rows 
            win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
            outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
        end
    end
end

你可以检查BSE如下:

if nimg(y,x) == 0 || nimg(y,x) == 255
    win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
    outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
else
    outimg(y-pad/2,x-pad/2) = nimg(y,x);
end

答案 1 :(得分:1)

如你所知,MATLAB有medfilt2。您可以使用此功能构建过滤器:

img = imread(...);
med = medfilt2(img);
mask = img==0 | img==255;
img(mask) = med(mask);

上面的代码是什么

  1. 计算中值滤波图像med
  2. 识别需要替换的像素(值为0或255的像素),从而产生可用于索引的逻辑数组mask,最后
  3. 将输入图像中的给定像素替换为中值滤波图像中的相应像素。