使用2d / 3dsplines从嘈杂的数据点集中查找曲率? (C ++)

时间:2012-11-04 11:16:29

标签: c++ algorithm surface bezier spline

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

Pulse profile with varying curvature

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

red line = dataset of points with the same value

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

(移动平均线已经应用)

1)通过切线的曲率
Curvature Approximation from two Points P and N

P点处的线的曲率由下式定义:

tangents of 2 points = curvature at one point

因此,曲率是P和N之间的角度增量的角度δ的石灰。由于我的点之间有一定的距离,我无法对石灰进行足够的近似,因此曲率计算不正确。我用圆圈测试它,它自然地具有恒定的曲率。但我无法重现这一点(只有1位有效数字是正确的)。

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

我计算了关于arclength的线的一阶导数,用移动平均线平滑,然后再次得到导数(二阶导数)。但在这里我也只有1个有效数字正确。 不幸的是,采用衍生工具将已经固有的噪声倍增到更高的水平。

3)用圆圈局部逼近线

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

Approximating the curvature with a circle

到目前为止效果最好(2位正确的有效数字),但我需要进一步改进。所以我的新想法如下:

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

到目前为止,我找不到可以生成这样的Bezier样条曲面的C ++库。你能指点我吗?

你是否认为这种方法值得一试,或者我的曲率会失去太多精确度?

你知道其他任何方法吗?

非常友好的问候, 扬

编辑:我似乎无法以新用户的身份发布图片,所以我从我的问题中删除了所有图片,即使我发现它们很重要,可以解释我的问题。有什么办法我还可以给他们看吗?

edit2:好的,完成了:)

1 个答案:

答案 0 :(得分:1)

ALGLIB支持各种插值:

  
      
  • 多项式插值
  •   
  • 有理插值
  •   
  • 样条插值
  •   
  • 最小二乘拟合(线性/非线性)
  •   
  • 双线性和双三次样条插值
  •   
  • 快速RBF插值/拟合
  •   

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

为了防止过度拟合您的嘈杂输入点,您应该应用某种平滑机制,例如:你可以尝试移动窗口平均/高斯/ FIR滤波器之类的东西。还可以看一下(Cubic)Smoothing Splines。