缩小时间序列的差距

问题描述 投票:0回答:2

我想合并右侧的块(由两个较小的块组成),使其看起来与左侧的两个块完全相同。我正在考虑形态学操作,但这些操作往往会改变原始形状,从而失去准确性。还有其他信号处理工具可以提供帮助吗?数据以时间序列的形式呈现。

segmentation problem

matlab signal-processing mathematical-morphology
2个回答
1
投票

首先我们需要一个测试数据集:

> 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

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
或循环遍历所有值并以您喜欢的任何方式探索它们的“邻居”。

© www.soinside.com 2019 - 2024. All rights reserved.