C++ 使用2d/3DSpline从一组嘈杂的数据点中查找曲率?(C+;+;)

C++ 使用2d/3DSpline从一组嘈杂的数据点中查找曲率?(C+;+;),c++,algorithm,surface,bezier,spline,C++,Algorithm,Surface,Bezier,Spline,我试图提取脉冲沿其轮廓的曲率(见下图)。用有限差分法计算出150×100个单元的长度和高度的网格,用C++实现。 我提取了所有具有相同值(轮廓/水平集)的点,并将它们标记为下图中的红色连续线。其他颜色可以忽略不计 然后,我尝试通过以下方法从已经嘈杂(由于网格离散化)的等高线中找到曲率: (移动平均线已应用) 1)通过切线的曲率 点p处直线的曲率由以下公式定义: 所以曲率是p和N之间弧长上的角度δ的极限。因为我的点之间有一定的距离,我不能足够接近极限,所以曲率计算不正确。我用一个自然曲率恒

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

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

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

(移动平均线已应用)

1)通过切线的曲率

点p处直线的曲率由以下公式定义:

所以曲率是p和N之间弧长上的角度δ的极限。因为我的点之间有一定的距离,我不能足够接近极限,所以曲率计算不正确。我用一个自然曲率恒定的圆来测试它。但我无法重现(只有1个有效数字是正确的)

2)弧长参数化直线的二阶导数

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

3)用圆局部逼近直线

因为圆半径的倒数是曲率,所以我使用了以下方法:

这是迄今为止效果最好的(2个正确的有效数字),但我需要进一步改进。因此,我的新想法如下:

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

<> P>迄今为止,我还没有找到一个C++库来生成这样的Bezier样条曲面。你能给我指一些吗

你认为这种方法值得一试吗,还是我的曲率会失去太多的准确性

你知道其他的方法吗

带着非常亲切的问候, 一月

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

edit2:好的,完成:)

有一个支持各种风格的插值:

  • 多项式插值
  • 有理插值
  • 样条插值
  • 最小二乘拟合(线性/非线性)
  • 双线性和双三次样条插值
  • 快速RBF插值/拟合
我不知道它是否符合你的所有要求。我个人还没有使用过这个库,但我相信三次样条插值可能就是你想要的(二次可微)


为了防止对噪声输入点进行过度拟合,您应该应用某种平滑机制,例如,您可以尝试使用移动窗口平均/高斯/FIR滤波器。还可以查看(三次)平滑样条曲线。

样条曲线用于生成点,而不是插值。请考虑最小二乘法。@珍娜-如果你在帖子中留下链接,一个拥有编辑权限的用户可以使图片内联。对新用户的限制是因为不是每个人都会发布漂亮的图片…@汉斯·帕桑:起初我考虑了最小二乘法,但事先不可能知道哪种函数接近我的脉搏。我不知道用LSQ可以得到任意函数(+前两个导数是光滑的)…非常感谢ALGLIB链接。听起来很有希望。我还查看了OpenCV,但找不到有关计算提取轮廓曲率的信息:(@JannaJ啊-这是轮廓的曲率,而不是你要找的曲面!很抱歉误解了。我更新了我的问题,使之更精确。无论如何,我很惊讶能用OpenCV找到曲面的曲率,但不是轮廓的曲率?@JannaJ,据我所知。