使用scipy.interpolate具有固定起点和终点的平滑样条曲线逼近

问题描述 投票:0回答:1

我正在尝试平滑放大的opencv轮廓线段。我正在使用平滑的样条曲线,我想在实际数据点中开始和结束样条曲线。我不太了解插值和样条拟合术语,因此我真的不知道要搜索什么。

我想要实现的是与下面的红色图形类似的东西,该图形经过平滑处理,我​​希望在其他图形的起点和终点的相同点处开始/结束。我不介意它不会通过其余数据点,而是宁愿控制平滑量,但需要固定起点和终点。可以通过scipy.interpolate实现吗?有其他选择吗?

我发现用于橙色图形的https://stackoverflow.com/a/47233842/4556546,与splpreps=0版本非常相似,即插值,但是它也使用s = 0,所以我看不出它对平滑有何帮助。

我还发现https://stackoverflow.com/a/32421626/4556546在其中操纵系数;同样,我看不出它如何帮助实现我的目标。由splprep平滑得到的系数已经导致红色图表的起点。

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import splprep, splev, make_interp_spline

border_segment = 16 * np.asarray([[[2, 8], [2, 9], [2, 10], [2, 11], [1, 12], [0, 13], [0, 14], [0, 15], [1, 16], [2, 17], [2, 18]]])

plt.scatter( border_segment[0].T[0], border_segment[0].T[1] )

# With smoothing s<>0
tck, u = splprep(border_segment[0].T, u=None, s=border_segment[0].shape[0]*16, per=0)
u_new = np.linspace(u.min(), u.max(), border_segment[0].shape[0]*16)
x_new, y_new = splev(u_new, tck, der=0)
plt.plot(x_new, y_new, color='red')

# With interpolation s=0
tck, u = splprep(border_segment[0].T, u=None, s=0.0, per=0)
x_new, y_new = splev(u_new, tck, der=0)
plt.plot(x_new, y_new, color='green')

# With boundary conditions, also see https://stackoverflow.com/a/47233842/4556546
l, r = [(1, (0, 0))], [(1, (0, 0))]
clamped_spline = make_interp_spline(u, np.array(border_segment[0].T).T, bc_type=(l, r))
x_new, y_new = clamped_spline(u_new).T
plt.plot(x_new, y_new, color='orange')

Plotting result from the code above

python numpy scipy interpolation spline
1个回答
0
投票

不是开箱即用。您可以尝试使用权重w在端点处修剪样条曲线。不过是YMMV。

© www.soinside.com 2019 - 2024. All rights reserved.