1

我想插入一个 3D 标量函数f(x, y, z)。我编写了一个 3D 线性插值算法(http://en.wikipedia.org/wiki/Trilinear_interpolation)。这还不错。

但是,我想要更复杂的东西,例如 3D 三次样条。是否有任何开源、易于使用、公开可用的代码用于插值 3D 标量?我更喜欢使用 C,但 Fortran 也可以。我想远离 Matlab。

我在这里看到过类似的问题:

在 3D 空间中插值标量场

有哪些好的 3D 插值库?

第二个可以使用 Matlab,但我不是。

至于第一个,主要的建议是 Shepard 的方法。我很好奇 Shepard 的方法有多准确。例如,在均匀网格的情况下,可以将 Shepard 方法仅应用于附近的网格点,在这种情况下,它是否往往比线性插值或三次样条更准确?我想不是,但不是 100% 确定,如果事实上它不是更好,那么如果有任何这样的代码可用,我宁愿使用类似样条的代码来查找代码。

4

3 回答 3

5

看看Geometric Tools for Interpolation:用于三次三次、均匀 B 样条等的模板化 C++。
einspline,一个用于 1d 2d 3d 中 B 样条的 C 库,似乎在 2013 年处于休眠状态;作者不回复电子邮件。此外,它是 C;C++ 模板将减少用于插值浮点数、颜色、vecs 的代码膨胀。 .) 我没有使用过这些。

Inverse distance weighting aka Shepard 方法中,您可以采用任意数量的邻居:在 3d 中,2^3 或 3^3 或 4^3 ...
一个普遍的问题是“下垂” - 请参阅链接中的图。

任何插值方法的“准确性”都很难衡量:什么是“黄金”,什么类型的数据/什么噪声?
你有两个衡量标准,数据误差和平滑度,需要权衡—— 照片放大 三个:
锯齿、模糊和边缘光晕。关于带限函数的样条插值有一些理论,但对于 IDW 来说根本没有。

补充: 靶心效应呢?

在几乎所有情况下,IDW 都是一个糟糕的选择。它假设您的所有输入数据点都是局部最小值或最大值!

好吧,如果远处有高峰值,IDW 的峰值可能会高于附近的数据点。例如在 1d 中,
IDW( [0 0] [1 0] [2 y] ) = y/7 at x = 1/2。但是对于某些任务,IDW 权重 ~ 1 / 距离可能太尖了,掉得太快了。
必须选择插值方法和内核来适应特定的数据和噪声——一门艺术。

于 2013-05-31T09:33:47.387 回答
2

bspline -fortran库对规则网格上的数据进行 2d-6d b-spline 插值。它是用现代 Fortran 编写的(有一个基本的子程序接口和一个面向对象的接口)。

于 2015-07-18T02:53:18.880 回答
0

vspline是一个用于 b 样条处理的 FOSS C++ 模板库。它与维度无关,因此您可以将其用于 3D 数据。它的重点是使用多线程 SIMD 代码有效地处理大型栅格数据集。如果您关心精度,它可以使用长双精度数进行计算,并具有极其精确的预计算常量以实现最大保真度。

于 2021-01-16T09:46:27.613 回答