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

5
我试图拟合一个二维点云(x和y坐标)。到目前为止,我在scipy的插值包中有了一些有限的成功,最显着的是UnivariateSpline,它产生了以下(次优的)拟合结果(请忽略颜色): 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()

以下是情节。有人能建议一种自动化决定的方法吗?可能是在评估每个的确定系数时进行循环绘图?还是有什么内置的东西?

splprep


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

Spline fit 1 (default s-value) Spline fit 2 (default s-value

这种方法还有什么进一步的调整可以做吗?或者,有没有竞争性的方法建议我去探索?


更新 3: 实际上,将节点数设置为5可以极大地帮助:

knots=5

1
我认为interp2d不是你要找的:它似乎是用于当你有一个以z=f(x,y)形式定义的三维函数时使用的。interp1d看起来更接近,但可能会遇到与UnivariateSpline相同的问题,因为它是用于一对一函数y=f(x)。你需要的结果是一个参数化函数。 - Oli
1
你看过 scipy.interpolate.splprep 函数吗:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splprep.html#scipy.interpolate.splprep? - Oli
1
@ees 你是否有其他数据集,其中s的这个值不能给出你想要的结果?如果没有,我建议使用硬编码的平滑值。如果你确实有这样的数据集,请在问题中包含它,并说明你要寻找什么结果。 - Oli
1
适合我看起来很好...你想要什么具体的不同呢? - Oli
1
@ees 我在这个领域不是专家,但据我搜索所得,没有提供所需功能的函数。就我所知,找到点的正确顺序相当于旅行商问题。快速搜索得出了这个解决方案:https://dev59.com/zF8e5IYBdhLWcg3wlbPx#44080908 。可以将其调整为重新排序您的点,使它们在splprep时能够正常工作(请注意,这个问题众所周知需要很长时间来计算答案)。 - Oli
显示剩余11条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接