基于二进制数组中的长度过滤岛 - MATLAB

Hoj*_*olf 1 matlab

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

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];
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想翻转仅重复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];
Run Code Online (Sandbox Code Playgroud)

根据我在网上找到的内容,Diff函数最常用于定位和删除序列.但是根据我的定位,它似乎针对所有实例.

Div*_*kar 5

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

imopen(Ar,[1,1,1])
Run Code Online (Sandbox Code Playgroud)

样品运行 -

>> 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
Run Code Online (Sandbox Code Playgroud)

不使用IP工具箱的矢量化解决方案 -

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;
Run Code Online (Sandbox Code Playgroud)

样品运行 -

>> 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
Run Code Online (Sandbox Code Playgroud)