【发布时间】: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: 从那以后,我在两个不同的点云上重新运行它,发现点的顺序显着改变了结果。当我将点云中的点重新排序为沿着初始拟合抛物线时,我的样条曲线得到了更好的结果。同样,结果仍然不是最理想的,如下所示。
我可以用这种方法做进一步的调整吗?或者,有人对我可以调查的竞争方法有什么建议吗?
【问题讨论】:
-
我不认为
interp2d是您正在寻找的:当您有一个以z=f(x,y)形式定义的 3d 函数时,它看起来就像是在使用它。interp1d看起来更接近,但可能会遇到与UnivariateSpline相同的问题,因为它是针对y=f(x)的一对一函数。您需要将结果作为参数函数。 -
你看过
scipy.interpolate.splprep函数吗:docs.scipy.org/doc/scipy/reference/generated/…? -
@ees 您是否有任何其他数据集,其中
s的值无法提供您想要的结果?如果没有,我会坚持使用硬编码的平滑度值。如果您确实有这样的数据集,请将其包含在问题中并说出您要寻找的结果。 -
合身对我来说看起来很棒...您特别想与众不同?
-
@ees 我不是这方面的专家,但据我的搜索告诉我,没有提供的功能可以满足您的需求。据我了解,找到正确的点顺序相当于旅行商问题。快速搜索得到了这个解决方案:stackoverflow.com/a/44080908/6744133。应该可以对其进行调整以重新排序您的积分,以便当您
splprep他们时它们可以正常工作(请注意,这个问题众所周知需要很长时间来计算答案)。
标签: python interpolation point-clouds spline