我有大量的数据,这些数据是对上下楼梯发出的波浪进行2D激光扫描的时间间隔(请参阅fig.1 fig.2 fig.3)。 由于水会溅出很多东西,因此扫描过程中会产生很多噪音。 现在,我想使扫描变得平滑。
我有2个问题:
如何应用移动中值过滤器(另一项研究类似问题的研究建议)?我只能找到单个说明,例如(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值(即扫描仪的“激光点”)水平排列。 data.y以相同的方式存储。 data.t值存储在(mx1)矩阵中。
我希望我能清楚地解释一切,并希望有人可以帮助我。我已经对此感到绝望...如果有任何遗漏或困惑,请告诉我。
答案 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
中的端点处理。