我试图提取沿其轮廓的脉冲曲率(请参见下图)。通过使用C++中实现的有限差分,在长度和高度为150 x 100的网格上计算脉冲。
我提取了所有具有相同值(轮廓/水平设置)的点,并将它们标记为下图中的红色连续线。其他颜色可以忽略不计。
然后,我尝试通过以下方法从已经嘈杂的(由于网格离散化)轮廓线中找到曲率:
(已应用移动平均值)
1)通过切线的曲率
在点P处的线的曲率定义为:
因此,曲率是在P和N之间的弧长上的角度δ的石灰。由于我的点之间有一定距离,因此我无法足够近似地估计石灰,因此曲率无法正确计算。我用一个圆进行了测试,该圆自然具有恒定的曲率。但是我无法重现(只有1个有效数字是正确的)。
2)由arclength 参数化的线的二阶导数
我计算了相对于弧长的直线的一阶导数,并用移动平均值对其进行了平滑处理,然后再次求导数(二阶导数)。但是在这里我也只得到1个有效数字。
不幸的是,采用导数会将已经固有的噪声放大到更大的水平。
3)用圆圈在本地逼近直线
由于圆半径的倒数是曲率,因此我使用以下方法:
到目前为止,效果最好(2个正确的有效数字),但我需要进一步完善。所以我的新主意如下:
我不想使用离散点上的值来确定曲率,而是要使用3维样条曲面来近似脉冲轮廓。然后,我从中提取某个值的水平集以获得一条平滑的点线,从中可以找到一个不错的曲率。
到目前为止,我找不到能生成此类Bezier样条曲面的C++库。你能指出我任何吗?
您还认为这种方法值得一试吗,否则我的曲率精度会损失太多吗?
您知道其他方法吗?
衷心的问候,
一月
编辑:似乎我不能以新用户身份发布图片,因此尽管我认为这些图片对解释我的问题很重要,但我从问题中删除了所有这些图片。我还有什么办法可以向他们展示?
edit2:好的,完成了:)
最佳答案
有ALGLIB支持各种插值方式:
我不知道它是否满足您的所有要求。我个人还没有使用这个库,但是我相信三次样条插值可能是您想要的(两次可微)。
为了防止过度适合您的嘈杂的输入点,您应该应用某种平滑机制,例如您可以尝试使用“移动窗口平均值/高斯/FIR滤波器”之类的方法。也可以看看(三次)平滑样条线。