用于图像处理的非线性滤波器-寻找遮罩内的最小值

时间:2019-03-21 12:24:15

标签: matlab for-loop image-processing

我对图像过滤器有个想法,但是我不知道如何在不使用MATLAB中的double-for-loop的情况下实现这一目标。

我有一个图像,并且我想在其上使用线性滤镜蒙版,例如:

[1,1,1,1,1]

此滤镜蒙版在图像上逐像素移动。对于每个街区,像素I均设置为周围街区的最小

这里是一个例子:

[ … image data      …]
[ …                 …]
[ …                 …]
[ … 23 68 155 20 53 …]
[ …                 …]

对于我的示例,我想用值155过滤居中像素。结果将是:

[ … image data      …]
[ …                 …]
[ …                 …]
[ … 23 68 20  20 53 …]
[ …                 …]

像素155被替换为附近的最小值。

我可以使用double-for循环来做到这一点,但是它确实很慢,太慢了,无法用于我的应用程序。

将为如何提高速度而高兴!谢谢

3 个答案:

答案 0 :(得分:2)

您的过滤器想法称为侵蚀。它是在图像处理工具箱中的功能imerode中实现的。对于您的情况,您可以申请:

result = imerode(image_data, [1,1,1,1,1]);

邻域可以具有任何形状。将元素设置为0可将它们从邻域中排除。例如,对于圆形社区,您可以使用

[0,1,1,1,0
 1,1,1,1,1
 1,1,1,1,1
 1,1,1,1,1
 0,1,1,1,0]

答案 1 :(得分:0)

如果我正确理解您的问题,那么您想要的是找到沿特定行具有指定窗口宽度的移动最小值。这可以通过在版本2016a中引入的movmin函数来完成。

知道movmin在默认情况下会处理列(如dim = 1)。因此,在您的情况下,您可能需要将dim参数设置为2(沿行移动),并丢弃窗口外部值的端点。示例代码如下:

k = randi(20,20,11); % make some samples
ci = 6; % sample at the center row
wd = 5; % filter window width
k(:,ci) = movmin(k(:,(ci-2:ci+2)),wd,2,'Endpoints','discard') % replace the center row samples

看看movmin文档以了解更多信息。

答案 2 :(得分:0)

answer of Y. Chang出现时,我正在开发自己的解决方案...尽管如此,我还是想发布它。至少,结果是相同的,因此似乎可行。

% Test input.
A = round(rand(5) * 10)

% Dimensions.
nRows = size(A, 1);
nCols = size(A, 2);

% Kernel.
b = [1, 1, 1, 1, 1]

% Step size.
step = floor(numel(b) / 2);

% Output.
B = zeros(nRows, nCols);
for k = 1:nRows
  temp = repmat(A(k, :), nCols + 2 * step, 1);
  idx = double(triu(ones(size(temp)), -numel(b) + 1) & tril(ones(size(temp)), 0));
  idx(idx == 0) = NaN;
  temp = temp .* idx;
  temp = min(temp, [], 2).';
  B(k, :) = temp(step+1:end-step);
end
B

% Compare with movmin function.
BB = movmin(A, numel(b), 2)

输出:

A =
    9    2    1    6    7
    2    5    9    1    7
    2    8    5   10    4
    2    0    6    5    8
    8    3   10    7    6

b =
   1   1   1   1   1

B =
   1   1   1   1   1
   2   1   1   1   1
   2   2   2   4   4
   0   0   0   0   5
   3   3   3   3   6

BB =
   1   1   1   1   1
   2   1   1   1   1
   2   2   2   4   4
   0   0   0   0   5
   3   3   3   3   6