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

3
我有一个大量数据的时间序列,记录了水波在楼梯上上下下的过程(见fig.1fig.2fig.3)。由于水花四溅,扫描结果中存在很多噪声。现在我希望对扫描结果进行平滑处理。
我有两个问题:
  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

数据的x值存储在一个(mxn)矩阵中,其中时间变化在垂直方向上排列,扫描仪的x值即“激光点”在水平方向上排列。数据的y值以同样的方式存储。数据的t值存储在一个(mx1)矩阵中。
我希望我已经清楚地解释了一切,并且有人可以帮助我。如果有任何遗漏或混淆,请告诉我。

你是想在时间维度上应用中值滤波器,还是在每个时间步长沿着x-y平面进行滤波? - CKT
沿着x-y平面,我想让每个时间步骤中的x-y图形变得更加平滑。 - B. Joe
1个回答

0

如果您想在x-y平面上应用中值滤波器,则考虑使用图像处理工具箱中的medfilt2。请注意,此函数仅接受2D输入,因此您需要循环处理第三个维度。

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

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

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

请注意,由于您在技术上尝试计算少于该值的值的平均值,因此边界会产生一些偏差。

或者,您可以使用嵌套调用movmean,因为平均操作是可分离的:

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

如果您的网格是可分离的,但不是均匀的,您仍然可以使用 movmean,只需使用 SamplePoints 名称-值对即可:
y = movmean(movmean(x, k, 2, 'SamplePoints', yv), k, 1, 'SamplePoints', xv);

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


非常感谢您提供详细的答案!在比较了不同的滤波器之后,简单的movmean命令给出了最佳结果:x1 = movmean(data.x, k); 等等。 - B. Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接