如何在 MATLAB 中使用内核实现中值滤波器来平滑图像?
How to implement median filter with a kernel in MATLAB to smooth an image?
我不知道如何在 MATLAB 中实现带有滑动 window(内核)的中值滤波器。我需要知道实现方式,这样我就可以尝试实现 BSE 算法(块智能擦除),它与中值滤波器非常相似。我需要它来擦除一些黑白像素。我知道有 medfilt2() 函数,但我需要知道它是如何实现的。
BSE算法是这样工作的:
BSE算法基于中值技术,用周围像素的中值代替极值(黑色或白色)像素。
1) 对于以测试像素为中心的 NxN window,N 通常为 N,建议使用更大的值。
2) 若f(i,j) = 0或f(i,j) = 255,则f(i,j)为必须估计的绝对极值像素;转到步骤 3。否则,f(i,j) 的值不变;转到步骤 4。
3) 当检测到极值像素时,将其灰度值替换为window.
的中值
4) 对下一个 window.
重复该过程
我的理解是,我需要实施中值滤波器,并有一个条件来检查当前像素值是 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
您可以按如下方式实现中值滤波器:
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
如您所述,MATLAB 有 medfilt2
。您可以使用此功能来构建过滤器:
img = imread(...);
med = medfilt2(img);
mask = img==0 | img==255;
img(mask) = med(mask);
上面的代码所做的是
- 计算中值滤波图像
med
、
- 识别需要替换的像素点(值为0或255的像素点),得到逻辑数组
mask
,可用于索引,最后
- 用中值滤波图像中的相应像素替换输入图像中的给定像素。
我不知道如何在 MATLAB 中实现带有滑动 window(内核)的中值滤波器。我需要知道实现方式,这样我就可以尝试实现 BSE 算法(块智能擦除),它与中值滤波器非常相似。我需要它来擦除一些黑白像素。我知道有 medfilt2() 函数,但我需要知道它是如何实现的。
BSE算法是这样工作的:
BSE算法基于中值技术,用周围像素的中值代替极值(黑色或白色)像素。
1) 对于以测试像素为中心的 NxN window,N 通常为 N,建议使用更大的值。
2) 若f(i,j) = 0或f(i,j) = 255,则f(i,j)为必须估计的绝对极值像素;转到步骤 3。否则,f(i,j) 的值不变;转到步骤 4。
3) 当检测到极值像素时,将其灰度值替换为window.
的中值4) 对下一个 window.
重复该过程我的理解是,我需要实施中值滤波器,并有一个条件来检查当前像素值是 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
您可以按如下方式实现中值滤波器:
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
如您所述,MATLAB 有 medfilt2
。您可以使用此功能来构建过滤器:
img = imread(...);
med = medfilt2(img);
mask = img==0 | img==255;
img(mask) = med(mask);
上面的代码所做的是
- 计算中值滤波图像
med
、 - 识别需要替换的像素点(值为0或255的像素点),得到逻辑数组
mask
,可用于索引,最后 - 用中值滤波图像中的相应像素替换输入图像中的给定像素。