缩小时间序列的差距

时间:2014-01-02 10:11:49

标签: matlab morphological-analysis

我想合并右边的块(由两个较小的块组成),看起来就像左边的两个块一样。我在考虑形态学操作,但这些往往会改变原始形状,从而失去准确性。还有其他信号处理工具可以提供帮助吗?数据以时间序列表示。

segmentation problem

2 个答案:

答案 0 :(得分: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中第3个和第4个块之间的间隙(我重新排列了输出):

> 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

你也可以用Y填补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

答案 1 :(得分: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或循环浏览所有值,并以您喜欢的任何方式探索他们的“邻居”。