使用 2d/3dsplines 从一组嘈杂的数据点中查找曲率? (C++)
Posted
技术标签:
【中文标题】使用 2d/3dsplines 从一组嘈杂的数据点中查找曲率? (C++)【英文标题】:Finding curvature from a noisy set of data points using 2d/3dsplines? (C++) 【发布时间】:2012-10-24 11:01:33 【问题描述】:我正在尝试沿其轮廓提取脉冲的曲率(见下图)。脉冲在长度和高度的网格上计算:150 x 100 单元格,使用 C++ 实现的有限差分。
我提取了所有具有相同值(轮廓/水平集)的点,并将它们标记为下图中的红色连续线。其他颜色可以忽略不计。
然后我尝试通过以下方式从这条已经嘈杂(由于网格离散化)的轮廓线中找到曲率:
(已应用移动平均线)
1) 通过切线的曲率
点P处的线曲率定义为:
所以曲率是在 P 和 N 之间的弧长上的角度 delta 的石灰。由于我的点之间有一定的距离,我无法足够近似石灰,因此曲率计算不正确。我用一个圆测试它,它自然有一个恒定的曲率。但我无法重现这一点(只有 1 个有效数字是正确的)。
2) 由弧长参数化的线的二阶导数
我计算了直线关于弧长的一阶导数,用移动平均线平滑,然后再次求导数(二阶导数)。但在这里我也只有 1 个有效数字是正确的。 不幸的是,求导会使已经固有的噪声乘以更大的水平。
3) 用圆局部逼近直线
由于圆半径的倒数是曲率,我使用了以下方法:
到目前为止,这效果最好(2 个正确的有效数字),但我需要进一步改进。所以我的新想法如下:
我不想使用离散点的值来确定曲率,而是想用 3 维样条曲面来近似脉冲轮廓。然后我从中提取某个值的水平集以获得一条平滑的点线,我可以从中找到一个很好的曲率。
到目前为止,我还没有找到可以生成这种贝塞尔样条曲面的 C++ 库。你能指点我吗?
您还认为这种方法值得一试吗,否则我的曲率会失去太多准确性吗?
你知道其他方法吗?
非常亲切的问候, 一月
编辑:似乎我不能以新用户的身份发布图片,所以我从我的问题中删除了所有图片,即使我发现它们对于解释我的问题很重要。有什么方法我还能展示给他们看吗?
edit2:好的,完成:)
【问题讨论】:
样条线可用于生成点,而不是插值。请考虑使用最小二乘法。 @Janna - 如果您将链接保留在帖子中,具有编辑权限的用户可以将图像内嵌。新用户的限制是因为不是每个人都发布漂亮的图片...... @Hans Passant:一开始我考虑的是最小二乘,但无法事先知道什么样的函数接近我的脉搏。我不知道 LSQ 是否可以实现任意函数(+前两个导数是平滑的)...... 【参考方案1】:ALGLIB 支持各种类型的插值:
多项式插值 有理插值 样条插值 最小二乘拟合(线性/非线性) 双线性和双三次样条插值 快速 RBF 插值/拟合
我不知道它是否满足您的所有要求。我个人还没有使用过这个库,但我相信三次样条插值可能是你正在寻找的(两次可微)。
为了防止对嘈杂的输入点过度拟合,您应该应用某种平滑机制,例如如果适用移动窗口平均/高斯/FIR 滤波器之类的东西,您可以尝试。另请查看(三次)平滑样条线。
【讨论】:
非常感谢您提供 ALGLIB 链接。听起来很有希望。我还查看了 OpenCV,但找不到有关计算提取轮廓曲率的信息:( @JannaJ 啊-这是轮廓的曲率,而不是您所追求的表面! 抱歉造成误会。我更新了我的问题以更准确。无论如何,我很惊讶用 OpenCV 可以找到曲面的曲率,但不能找到轮廓? @JannaJ 据我所知。以上是关于使用 2d/3dsplines 从一组嘈杂的数据点中查找曲率? (C++)的主要内容,如果未能解决你的问题,请参考以下文章