繁体   English   中英

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

[英]Python - Interpolate 2D point cloud using splines

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

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

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


更新 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()

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

splprep


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

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

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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM