Python - 使用样条线插值二维点云

Posted

技术标签:

【中文标题】Python - 使用样条线插值二维点云【英文标题】:Python - Interpolate 2D point cloud using splines 【发布时间】:2020-08-25 09:55:05 【问题描述】:

我正在尝试拟合 2D 点云(x 和 y 坐标)。到目前为止,我在 scipy 的插值包方面取得了有限的成功,最值得注意的是 UnivariateSpline,它产生了以下(次优)拟合(请忽略颜色):

但是,这显然是错误的包,因为我需要一条可以在抛物线点云边缘附近自行弯曲的最终曲线(因此不再是一维函数)。

然后我阅读了interp2d,例如,但不明白我的z 数组是什么。有没有我可能忽略的更好的包类?


更新 1:按照 cmets 中的建议,我已使用 scipy.interpolate.splprep 重做此操作;我的一般设置是:

from scipy.interpolate import splprep, splev
pts = np.vstack((X.ravel(), Y.ravel)) #X and Y contain my points
(tck, u), fp, ier, msg = splprep(pts, u=None, per=0, k=3, full_output=True) #s = optional parameter (default used here)
print('Spline score:',fp) #goodness of fit flatlines after a given s value (and higher), which captures the default s-value as well 
x_new, y_new = splec(u_new, tck, der=0)
plt.plot(x_new, y_new, 'k')
plt.show()

剧情如下。在评估每个s 图的确定系数时,任何人都可以建议一种方法来自动决定s... 可能是一个循环?还是里面有什么东西?


更新 2: 从那以后,我在两个不同的点云上重新运行它,发现点的顺序显着改变了结果。当我将点云中的点重新排序为沿着初始拟合抛物线时,我的样条曲线得到了更好的结果。同样,结果仍然不是最理想的,如下所示。

我可以用这种方法做进一步的调整吗?或者,有人对我可以调查的竞争方法有什么建议吗?


更新 3:实际上,设置节数 = 5 有很大帮助:

【问题讨论】:

我不认为 interp2d 是您正在寻找的:当您有一个以 z=f(x,y) 形式定义的 3d 函数时,它看起来就像是在使用它。 interp1d 看起来更接近,但可能会遇到与UnivariateSpline 相同的问题,因为它是针对y=f(x) 的一对一函数。您需要将结果作为参数函数。 你看过scipy.interpolate.splprep函数吗:docs.scipy.org/doc/scipy/reference/generated/…? @ees 您是否有任何其他数据集,其中s 的值无法提供您想要的结果?如果没有,我会坚持使用硬编码的平滑度值。如果您确实有这样的数据集,请将其包含在问题中并说出您要寻找的结果。 合身对我来说看起来很棒...您特别想与众不同? @ees 我不是这方面的专家,但据我的搜索告诉我,没有提供的功能可以满足您的需求。据我了解,找到正确的点顺序相当于旅行商问题。快速搜索得到了这个解决方案:***.com/a/44080908/6744133。应该可以对其进行调整以重新排序您的积分,以便当您 splprep 他们时它们可以正常工作(请注意,这个问题众所周知需要很长时间来计算答案)。 【参考方案1】:

我遇到了类似的问题,我的问题的解决方案是使用主曲线 (https://hastie.su.domains/Papers/Principal_Curves.pdf)。

GitHub 上提供的此实现可以帮助您:https://github.com/zsteve/pcurvepy。

【讨论】:

以上是关于Python - 使用样条线插值二维点云的主要内容,如果未能解决你的问题,请参考以下文章

python / scipy中的多元样条插值?

Python数学建模系列:数值逼近

二维线性插值产生数据范围之外的结果

在Python / Numpy / Scipy中找到两个数组之间的插值交集

气象 python 二维线性插值

如何使用 CuPy 在 python 上进行三次样条插值?