不确定这在SO上是否可能有效,但我希望有人可以建议使用正确的算法。
我有以下RAW数据。
在图像中,您可以看到“步骤”。基本上我希望得到这些步骤,但随后获得所有数据的移动平均值。在下图中,您可以看到移动平均线:
然而,您会注意到,在“步数”处,移动平均线会减小我希望保持高垂直渐变的渐变。
是否有任何平滑技术会考虑大的垂直“偏移”,但会平滑其他数据?
答案 0 :(得分:2)
我建议先检测步骤,然后逐步平滑每个步骤。
您知道如何进行平滑处理,边缘/步长检测也非常简单(例如,请参阅here)。典型的边缘检测方案是平滑数据,然后将其与一些滤波器(例如,将显示步骤位置的数组[-1,1])相乘/卷积/交叉核心化。在数学上下文中,这可以被视为研究绘图的导数以找到拐点(对于某些滤波器)。
另一种" hackish"解决方案是进行移动平均,但排除平滑的异常值。您可以使用某个阈值 t 来确定异常值。换句话说,对于值为 v 的每个点 p ,取围绕它的 x 点并找到之间的那些点的子集> v - t 和 v + t ,并将这些点的平均值作为 p的新值
答案 1 :(得分:2)
简单技术#1:使用宽度适中的中值滤波器 - 比如大约5个样本,或者7.这提供了一个输出值,它是相应输入值的中值和几个任何一方的直接邻居。它将摆脱那些尖峰,并做好保留阶梯边缘的工作。
中值滤波器在我所知的所有数字运算工具包中提供,例如Matlab,Python / Numpy,IDL等,以及用于编译语言的库,例如C ++,Java(尽管不会想到特定的名称)现在......)
技术#2,可能不太好:使用Savitzky-Golay平滑滤镜。这通过在每个输出样本处使用相应的输入样本和邻域点(非常类似于中值滤波器)有效地对数据进行最小二乘多项式拟合来工作。众所周知,SG更平滑,可以很好地保留峰值和尖锐的转换。
SG过滤器通常由大多数信号处理和数字运算包提供,但可能不像中值滤波器那样常见。
技术#3,最多的工作,需要最多的经验和判断力:继续使用更平滑 - 移动的盒子平均值,高斯,无论如何 - 然后创建一个混合原始的输出使用平滑的数据。由您创建的新数据系列控制的混合从全原始(在平滑的0%中混合)到全平滑(100%)不等。
要控制混合,请从边缘检测器开始检测跳跃。您可能希望首先对数据进行中值滤波以消除尖峰。然后加宽(图像处理术语中的膨胀)或平滑并重新规范边缘检测器的输出,并将其翻转,使其在跳跃处和附近提供0.0,在其他地方提供1.0。也许你想要顺利过渡加入它们。这是正确的艺术,这取决于数据的使用方式 - 对我来说,通常是人类可以看到的图像。如果进行不同的调整,自动嵌入式控制系统可能效果最佳。
这种技术的主要优点是可以插入您喜欢的任何类型的平滑滤镜。在混合控制值为零的情况下,它不会产生任何影响。主要缺点是跳跃(由操纵边缘检测器输出定义的小邻域)将包含噪声。