如何在 Matlab 中的二维扫描时间序列上应用移动中值滤波器?
How to apply a moving median filter on a time series of 2D scans in Matlab?
我有大量的二维激光扫描波 运行 上下楼梯延时摄影的大量数据(参见 fig.1fig.2fig.3)。
扫描中有很多噪音,因为水溅得很厉害。
现在我想平滑扫描。
我有两个问题:
如何应用移动中值滤波器(根据处理类似问题的另一项研究的建议)?我只能找到单身的说明,例如(x,y) 或 (t,y) 图,但不适用于随时间变化的 x 和 y 值。也许普通过滤器也能做到这一点,但我对此也一无所知。
扫描仪位于固定点 (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
中的端点处理。
我有大量的二维激光扫描波 运行 上下楼梯延时摄影的大量数据(参见 fig.1fig.2fig.3)。 扫描中有很多噪音,因为水溅得很厉害。 现在我想平滑扫描。
我有两个问题:
如何应用移动中值滤波器(根据处理类似问题的另一项研究的建议)?我只能找到单身的说明,例如(x,y) 或 (t,y) 图,但不适用于随时间变化的 x 和 y 值。也许普通过滤器也能做到这一点,但我对此也一无所知。
扫描仪位于固定点 (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
中的端点处理。