我有一个矩阵与一些非零(让我们说=11)元素
a=zeros(6,3);
a(3,1)=11;
a(4,1)=11;
a(6,1)=11;
a(1,2)=11;
a
a =
0 11 0
0 0 0
11 0 0
11 0 0
0 0 0
11 0 0
Run Code Online (Sandbox Code Playgroud)
我希望这些元素"扩散"到相邻的零元素,这意味着所有与非零相邻的零元素应该变为非零.上述案例的预期输出应为:
11 11 11
11 11 0
11 11 0
11 11 0
11 0 0
11 11 0
Run Code Online (Sandbox Code Playgroud)
我的想法是将原始矩阵的梯度非零的所有点设置为非零:
[dx,dy] = gradient(a);
a(find(dx~=0))=11
a(find(dy~=0))=11
Run Code Online (Sandbox Code Playgroud)
a =
Run Code Online (Sandbox Code Playgroud)11 11 11 0 0 0 11 11 0 11 11 0 0 0 0 11 11 0a =
Run Code Online (Sandbox Code Playgroud)11 11 11 11 11 0 11 11 0 11 11 0 0 0 0 11 11 0
但它不起作用,因为对于由非零元素包围的元素,梯度为零.对于我的例子中的元素(5,1):-5.5 + 5.5 = 0
有人可以建议一些替代方法吗?
您所描述的仅供参考,更正式地称为扩张手术.
你尝试过的几种替代方案.
1.如果您有图像处理工具箱,则可以使用imdilate十字形窗口.
% define a cross-shaped window
se = strel('diamond',1);
a = imdilate(a, se);
Run Code Online (Sandbox Code Playgroud)
2.如果您有图像处理工具箱,则可以使用ordfilt2.这是使用十字形窗口执行最大过滤.
% build cross shaped window
win = [0 1 0
1 1 1
0 1 0];
% max filter
ord = sum(win(:));
a = ordfilt2(a, ord, win);
Run Code Online (Sandbox Code Playgroud)
3.如果您没有图像处理工具箱,则可以通过改变逻辑索引来获得结果.
[r,c] = size(a);
idx1 = a>0;
idx2 = [idx1(2:end,:); false(1,c)];
idx3 = [false(1,c); idx1(1:(end-1),:)];
idx4 = [idx1(:,2:end) false(r,1)];
idx5 = [false(r,1) idx1(:,1:(end-1))];
idx_all = idx1 | idx2 | idx3 | idx4 | idx5;
a(idx_all) = 11;
Run Code Online (Sandbox Code Playgroud)