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 - 使用样条线插值二维点云的主要内容,如果未能解决你的问题,请参考以下文章