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