【问题标题】:Filter islands based on length in a binary array - MATLAB根据二进制数组中的长度过滤孤岛 - MATLAB
【发布时间】:2017-10-31 10:21:16
【问题描述】:

我有一个二进制数组,我想根据它们重复的长度来翻转值。举个例子

Ar = [0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1];

理想情况下,我想翻转仅重复 2 次或更少次的 1,从而得到以下结果。

Ar = [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1];

根据我在网上找到的信息,Diff 函数最常用于定位和删除序列。但从我所拥有的located 来看,它似乎针对所有实例。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    只需使用图像处理工具箱中的imopen,内核为3ones -

    imopen(Ar,[1,1,1])
    

    示例运行 -

    >> Ar = [0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1];
    >> out = imopen(Ar,[1,1,1]);
    >> [Ar(:) out(:)]
    ans =
         0     0
         1     0
         0     0
         0     0
         0     0
         1     0
         1     0
         0     0
         0     0
         0     0
         1     1
         1     1
         1     1
         1     1
         1     1
         0     0
         0     0
         0     0
         0     0
         1     1
         1     1
         1     1
         1     1
         1     1
         1     1
    

    不使用 I.P. 的矢量化解决方案工具箱 -

    function out = filter_islands_on_length(Ar, n)
    out = Ar;
    a = [0 Ar 0];
    d = diff(a);
    r = find(d);
    
    s0 = r(1:2:end);
    s1 = r(2:2:end);
    
    id_arr = zeros(1,numel(Ar));
    m = (s1-s0) <= n;
    
    id_arr(s0(m)) = 1;
    id_arr(s1(m)) = -1;
    out(cumsum(id_arr)~=0) = 0;
    

    示例运行 -

    >> Ar
    Ar =
         0     1     0     0     0     1     1     0     0     0     1     1     1
    >> filter_islands_on_length(Ar, 2)
    ans =
         0     0     0     0     0     0     0     0     0     0     1     1     1
    >> filter_islands_on_length(Ar, 1)
    ans =
         0     0     0     0     0     1     1     0     0     0     1     1     1
    

    【讨论】:

    • 这实际上是我想到的第一件事,因为我想到了相同的解决方案。然而,我担心这会是做一些更简单的事情的迂回方式。
    • @Hojo.Timberwolf 你能解释一下“更简单”的方法吗?
    • 我猜简单是错误的词。我担心引入不同的 matlab 工具箱来完成一项任务,因为不是每个使用我的代码的人都可能拥有图像处理工具箱。我正在尝试找到使用基础的解决方案。但是,如果他们不是,那么这是最好的选择。
    • @Hojo.Timberwolf 最后看看新的解决方案。
    【解决方案2】:

    另一个不需要工具箱但需要 Matlab 2016a 或更高版本的解决方案:

    n = 3; % islands shorter than n will be removed
    Ar = movmax(movsum(Ar,n),[ceil(n/2-1) floor(n/2)])==n;
    

    【讨论】:

      猜你喜欢
      • 2021-08-14
      • 2021-12-25
      • 2017-09-28
      • 2016-11-03
      • 2021-03-07
      • 2016-10-22
      • 2020-02-04
      • 1970-01-01
      相关资源
      最近更新 更多