【问题标题】:spread an island of non-zero elements散布非零元素的岛屿
【发布时间】:2018-02-28 04:59:05
【问题描述】:

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

一个=

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

一个=

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


    【解决方案1】:

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

    【讨论】:

    • 酷!从中学到了很多。
    • XD “扩张”这个名字很有意义!谢谢!
    【解决方案2】:

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

    mask = [ 0 1 0 
             1 0 1
             0 1 0 ];
    
    a(conv2(a,mask,'same')~=0)=11;
    

    【讨论】:

      【解决方案3】:

      正如您所指出的,渐变的概念在遇到[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
      

      【讨论】:

      • 这很聪明!
      • 这看起来有点像形态 PDE 的一步(jodag 建议的膨胀可以用形态 PDE 近似)。
      • 是的。在我看来,许多图像处理步骤实际上是 PDE。即边界的提取。 (虽然我对他们了解不少。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多