【问题标题】:Smooth spline approximation with fixed start and end points using scipy.interpolate使用 scipy.interpolate 进行具有固定起点和终点的平滑样条近似
【发布时间】:2020-06-12 18:01:27
【问题描述】:

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

我想要实现的是类似于下面的红色图表,它是平滑的,我想在其他图表开始和结束的相同点开始/结束。我不介意它不通过剩余的数据点,我宁愿控制平滑量,但需要固定开始和结束。这可以通过scipy.interpolate 实现吗?有替代品吗?

我找到了用于橙色图的https://stackoverflow.com/a/47233842/4556546,它与带有s=0splprep 版本非常相似,即插值,但这也使用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')

【问题讨论】:

    标签: python numpy scipy interpolation spline


    【解决方案1】:

    你试过cv::approxPolyDP吗?它根据指定的精度删除中间点,但保持起点和终点不变。你得到一条简化的折线,然后你可以通过它的点绘制一条样条线。

    【讨论】:

      【解决方案2】:

      不是开箱即用的。 您可以尝试使用权重 w 在端点处剪裁样条线。虽然是 YMMV。

      【讨论】:

      • 非常感谢您直接确认这是不可能的!至少我知道我没有遗漏一些明显的东西。您是否知道可以提供此功能的替代软件包、附加组件或脚本?我应该搜索任何特定的词吗?谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      相关资源
      最近更新 更多