matlab - 散布一个非零元素岛

标签 matlab matrix

我有一个包含一些非零(比方说 =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

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

最佳答案

仅供引用,您所描述的更正式地称为 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;

关于matlab - 散布一个非零元素岛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49022248/

相关文章:

c++ - MPI 同步 vector 矩阵

r - 有效地存储大但低秩的矩阵

c - 二维变换、矩阵乘法

python - 稀疏矩阵是否有 numpy/scipy 点积,仅计算结果的对角线条目?

c# - 使用 PInvoke char** (C -> C#) 更正返回值

c - MATLAB 在 C 中的 'meshgrid'

matlab - matlab在直方图上画垂直线

Matlab实时绘图

function - 存在两个时如何选择特定的 .m 函数?

python - 如何用python获得方阵的伪行列式