【发布时间】: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 是否可以实现任意函数(+前两个导数是平滑的)......
标签: c++ algorithm surface bezier spline