如何在Matlab中的2D扫描时间序列上应用移动中值滤波器?

时间:2018-07-03 17:50:01

标签: matlab filter median moving-average waveform

我有大量的数据,这些数据是对上下楼梯发出的波浪进行2D激光扫描的时间间隔(请参阅fig.1 fig.2 fig.3)。 由于水会溅出很多东西,因此扫描过程中会产生很多噪音。 现在,我想使扫描变得平滑。

我有2个问题:

  1. 如何应用移动中值过滤器(另一项研究类似问题的研究建议)?我只能找到单个说明,例如(x,y)或(t,y)图,但不随时间变化的x和y值。也许普通的过滤器也可以做到这一点,但是我也没有任何线索。

  2. 扫描仪位于固定点(222m),因此所有数据峰值均指向天花板上的该点。是否有可能或有必要将此纳入平滑过程?

这是代码的一部分(我希望它足以得到它):

% Plot data as real time profile
x1=data.x;y1=data.y;
t=data.t;
% add moving median filter here?
h1=plot(x1(1,:),y1(1,:));
axis([210 235 3 9]) 
ht=title('Scanner data');
for i=1:1:length(t);    
set(h1,'XData',x1(i,:),'YData',y1(i,:));set(ht,'String',sprintf('t = %5.2f 
s',data.t(i)));pause(.01);end

data.x值存储在一个(mxn)矩阵中,其中时间变化垂直排列,而x值(即扫描仪的“激光点”)水平排列。 data.y以相同的方式存储。 data.t值存储在(mx1)矩阵中。

我希望我能清楚地解释一切,并希望有人可以帮助我。我已经对此感到绝望...如果有任何遗漏或困惑,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果要在x-y平面上应用中值滤镜,请考虑使用“图像处理工具箱”中的medfilt2。请注意,此功能仅接受二维输入,因此您必须遍历三维。

还要注意,medfilt2假设x和y数据是均匀间隔的,因此,如果x和y数据没有落在均匀间隔的网格上,则可能需要手动循环索引,提取相应的索引修补并计算中位数。

如果您可以/希望应用平均滤波器而不是中值滤波器,并且如果您有均匀间隔的数据,则可以使用convn通过执行以下操作来计算k x k移动平均值:< / p>

y = convn(x, ones(k,k)/(k*k), 'same');

请注意,您会在边界上产生一些偏见,因为从技术上讲,当您拥有的可用值少于该数量时,您将尝试计算平均k^2个像素。

或者,由于平均操作是可分离的,因此可以使用对movmean的嵌套调用:

y = movmean(movmean(x, k, 2), k, 1);

如果网格是可分离的,但不是统一的,则仍然可以使用movmean,只需使用SamplePoints名称/值对:

y = movmean(movmean(x, k, 2, 'SamplePoints', yv), k, 1, 'SamplePoints', xv);

您还可以使用movmean名称/值对来控制Endpoints中的端点处理。