我对图像过滤器有个想法,但是我不知道如何在不使用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循环来做到这一点,但是它确实很慢,太慢了,无法用于我的应用程序。
将为如何提高速度而高兴!谢谢
答案 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