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

How to apply a moving median filter on a time series of 2D scans in Matlab?

我有大量的二维激光扫描波 运行 上下楼梯延时摄影的大量数据(参见 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

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

我希望我解释清楚了一切,希望有人能帮助我。我已经很绝望了...如果有任何遗漏或混淆,请告诉我。

如果您尝试在 x-y 平面中应用中值滤波器,请考虑使用图像处理工具箱中的 medfilt2。请注意,此函数仅接受二维输入,因此您必须遍历三维。

另请注意,medfilt2 假设 x 和 y 数据是均匀间隔的,因此如果您的 x 和 y 数据没有落在均匀间隔的网格上,您可能必须手动遍历索引,提取相应的补丁,并计算中位数。

如果您 can/want 应用平均滤波器而不是中值滤波器,并且如果您有均匀间隔的数据,那么您可以使用 convn 计算 k x k 移动平均值通过做:

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);

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