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

标签 matlab filter median moving-average waveform

我有大量关于波浪上下楼梯的二维激光扫描延时数据(参见 fig.1 fig.2 fig.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 值即扫描仪的“激光点”水平排列。 data.y 以相同的方式存储。 data.t 值存储在 (mx1) 矩阵中。

我希望我解释清楚了所有内容,希望有人能帮助我。我已经非常绝望了...如果有任何遗漏或混淆,请告诉我。

最佳答案

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

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

如果您可以/想要应用平均滤波器而不是中值滤波器,并且如果您有均匀间隔的数据,那么您可以使用 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 中的端点处理。

关于matlab - 如何在 Matlab 中的二维扫描时间序列上应用移动中值滤波器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51160390/

相关文章:

r - 过滤每个主题有多个事件之间的行

java - 似乎无法使其发挥作用。无法按照我想要的方式得到中位数

image-processing - Opencv中的位数模糊如何使用模式?

matlab - 在 matlab 中具有不同误差条的多维(2d 更好 3d)散点图

matlab - 获取一条线的像素 - :- MATLAB

matlab - 警告 : "Parethesize the multiplication of ' D' and its transpose to ensure the result is Hermetian.“

powershell - 如何在 PowerShell 复制脚本中正确过滤多个字符串

javascript - Angularjs:名称以 ! 开头时搜索过滤器不起作用(感叹号)

python - 在Python中,如果小数点后没有有效数字,则获取整数;如果小数点后有有效数字,则获取浮点型

matlab - 在Matlab中将标量打印为int32