Python - 使用样条线插值 2D 点云

ees*_*ees 5 python interpolation spline point-clouds

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

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

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


更新 1:按照评论中的建议,我使用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()
Run Code Online (Sandbox Code Playgroud)

情节如下。任何人都可以建议一种方法,用于在评估每个图的确定系数时自动决策s......可能的循环s?或者里面有什么东西被烤了?

spl准备


更新 2:我已经在两个不同的点云上重新运行了这个,发现点的顺序显着改变了结果。当我将点云中的点重新排序为沿着抛物线的初始拟合时,我使用样条线获得了更好的结果。同样,结果仍然不是最优的,如下所示。

样条拟合 1(默认 s 值) 样条拟合 2(默认 s 值

我可以用这种方法进行进一步的调整吗?或者,有人对我可以研究的竞争方法有建议吗?


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

小智 0

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

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