传播一个非零元素的岛屿

问题描述 投票:2回答:3

我有一个矩阵与一些非零(让我们说=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

我希望这些元素“扩散”到相邻的零元素,这意味着所有与非零相邻的零元素应该变为非零。上述案例的预期输出应为:

11    11    11
11    11     0
11    11     0
11    11     0
11     0     0
11    11     0

我的想法是将原始矩阵的梯度非零的所有点设置为非零:

[dx,dy] = gradient(a);
a(find(dx~=0))=11
a(find(dy~=0))=11

a =

11    11    11
 0     0     0
11    11     0
11    11     0
 0     0     0
11    11     0

a =

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

有人可以建议一些替代方法吗?

matlab matrix
3个回答
2
投票

正如你所指出的那样,当遇到[11 0 11][11 0 11]'时,渐变的想法会遇到麻烦,但我们可以通过更改它中的数字来解决它。即[11 0 12]的梯度是[-11 0.5 12]

clc; clear;
%data
a=zeros(6,3);
a(3,1)=11;
a(4,1)=11;
a(6,1)=11;
a(1,2)=11;
a

%change the number in the matrix
ind=find(a ~= 0);
a(ind)=rand(length(ind),1)*10;

%spread out non-zero elements
[dx,dy] = gradient(a);
a(find(dx~=0))=11;
a(find(dy~=0))=11;
a

输出:

a =

     0    11     0
     0     0     0
    11     0     0
    11     0     0
     0     0     0
    11     0     0


a =

    11    11    11
    11    11     0
    11    11     0
    11    11     0
    11     0     0
    11    11     0

5
投票

你所描述的仅仅是正式名称为dilation operation

你尝试过的几种替代方案。

1.如果你有图像处理工具箱,你可以使用带有十字形窗口的imdilate

% define a cross-shaped window
se = strel('diamond',1);
a = imdilate(a, se);

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);

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;

4
投票

您可以使用conv2查找邻居的索引:

mask = [ 0 1 0 
         1 0 1
         0 1 0 ];

a(conv2(a,mask,'same')~=0)=11;
© www.soinside.com 2019 - 2024. All rights reserved.