首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散布一个非零元素的岛屿

散布一个非零元素的岛屿
EN

Stack Overflow用户
提问于 2018-02-28 04:59:05
回答 3查看 90关注 0票数 2

我有一个含有非零元素(比如=11)的矩阵。

代码语言:javascript
复制
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

我希望这些元素“扩散”到邻近的零元素,这意味着所有与非零相邻的零元素都应该变成非零。上述情况的预期产出应是:

代码语言:javascript
复制
11    11    11
11    11     0
11    11     0
11    11     0
11     0     0
11    11     0

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

代码语言:javascript
复制
[dx,dy] = gradient(a);
a(find(dx~=0))=11
a(find(dy~=0))=11

A= 11 11 11 0 0 0 11 11 0 0 0 A= 11 11 11 0 0 0

但是它不能工作,因为对于被非零元素包围的元素来说,梯度是零。对于我的示例中的元素(5,1):-5.5 + 5.5 =0

有人能提出一些替代的方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-28 05:35:36

正如您已经指出的,当梯度满足[11 0 11][11 0 11]'时,梯度的概念是有问题的,但是我们可以通过改变其中的数字来解决它。即[11 0 12]的梯度为[-11 0.5 12]

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-02-28 05:41:45

您所描述的FYI更正式地称为扩张手术

一些替代你尝试过的东西。

1。如果您有图像处理工具箱,则可以使用带有十字窗口的imdilate

代码语言:javascript
复制
% define a cross-shaped window
se = strel('diamond',1);
a = imdilate(a, se);

2。如果您有图像处理工具箱,则可以使用ordfilt2。这是执行最大过滤使用交叉窗口。

代码语言:javascript
复制
% 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。如果您没有图像处理工具箱,您可以通过移动逻辑索引来获得结果。

代码语言:javascript
复制
[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;
票数 5
EN

Stack Overflow用户

发布于 2018-02-28 08:01:17

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

代码语言:javascript
复制
mask = [ 0 1 0 
         1 0 1
         0 1 0 ];

a(conv2(a,mask,'same')~=0)=11;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49022248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档