我想合并右侧的块(由两个较小的块组成),使其看起来与左侧的两个块完全相同。我正在考虑形态学操作,但这些操作往往会改变原始形状,从而失去准确性。还有其他信号处理工具可以提供帮助吗?数据以时间序列的形式呈现。
首先我们需要一个测试数据集:
> x=1:40; y=x*0; y(5:10)=1; y(15:20)=1; y(25:30)=1;y(33:36)=1;
> disp([x;y])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0
现在我们找到第一个
> BlockStart = find( diff(y)>0 )+1
BlockStart =
5 15 25 33
以及每个非零块的最后一个索引(请注意,数字确实与我用来制作测试数据的数字一致)
> BlockEnd = find( diff(y)<0 )
BlockEnd =
10 20 30 36
然后我们只需删除 X 中第三个和第四个块之间的间隙(我重新排列了输出):
> x( BlockEnd(3)+1 : BlockStart(4)-1) = []; % delete the gap in X
> y( BlockEnd(3)+1 : BlockStart(4)-1) = []; % delete the gap in Y
> disp([x;y])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 38 39 40
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
您也可以用 1 来填充 Y 中的空白,而不是删除这些元素:
> y( BlockEnd(3)+1 : BlockStart(4)-1) = 1;
> disp([x;y])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
处理差距的方法有多种。这假设单个值可能意外为零(或较低),并且应该修复以匹配其邻居:
vo =ones(1,3);
vz = zeros(1,3);
ts = [vo vz vo vz vz vo 0 vo];
bar(ts)
c = min(circshift(ts,[0 1]),circshift(ts,[0 -1]));
ts_nogap = max(ts,c);
figure, bar(ts_nogap)
对于更高级的要求,请考虑使用
filter
而不是 circshift
或循环遍历所有值并以您喜欢的任何方式探索它们的“邻居”。