我试图提取沿其轮廓的脉冲曲率(请参见下图)。通过使用C++中实现的有限差分,在长度和高度为150 x 100的网格上计算脉冲。

我提取了所有具有相同值(轮廓/水平设置)的点,并将它们标记为下图中的红色连续线。其他颜色可以忽略不计。

然后,我尝试通过以下方法从已经嘈杂的(由于网格离散化)轮廓线中找到曲率:

(已应用移动平均值)

1)通过切线的曲率

在点P处的线的曲率定义为:

因此,曲率是在P和N之间的弧长上的角度δ的石灰。由于我的点之间有一定距离,因此我无法足够近似地估计石灰,因此曲率无法正确计算。我用一个圆进行了测试,该圆自然具有恒定的曲率。但是我无法重现(只有1个有效数字是正确的)。

2)由arclength 参数化的线的二阶导数

我计算了相对于弧长的直线的一阶导数,并用移动平均值对其进行了平滑处理,然后再次求导数(二阶导数)。但是在这里我也只得到1个有效数字。
不幸的是,采用导数会将已经固有的噪声放大到更大的水平。

3)用圆圈在本地逼近直线

由于圆半径的倒数是曲率,因此我使用以下方法:

到目前为止,效果最好(2个正确的有效数字),但我需要进一步完善。所以我的新主意如下:

我不想使用离散点上的值来确定曲率,而是要使用3维样条曲面来近似脉冲轮廓。然后,我从中提取某个值的水平集以获得一条平滑的点线,从中可以找到一个不错的曲率。

到目前为止,我找不到能生成此类Bezier样条曲面的C++库。你能指出我任何吗?

您还认为这种方法值得一试吗,否则我的曲率精度会损失太多吗?

您知道其他方法吗?

衷心的问候,
一月

编辑:似乎我不能以新用户身份发布图片,因此尽管我认为这些图片对解释我的问题很重要,但我从问题中删除了所有这些图片。我还有什么办法可以向他们展示?

edit2:好的,完成了:)

最佳答案

ALGLIB支持各种插值方式:



我不知道它是否满足您的所有要求。我个人还没有使用这个库,但是我相信三次样条插值可能是您想要的(两次可微)。

为了防止过度适合您的嘈杂的输入点,您应该应用某种平滑机制,例如您可以尝试使用“移动窗口平均值/高斯/FIR滤波器”之类的方法。也可以看看(三次)平滑样条线。

09-07 21:38