首页 > 解决方案 > 我如何才能找到数据中存在弯曲/切割的点?

问题描述

我有以下数据点: 此数据列表中有 5 个子列表。我想做的是找到曲率最大的点。

for i in range(len(smallest_5)):
    x = [x for x,y in smallest_5[i]]
    y = [y for x,y in smallest_5[i]]
    plt.scatter(x,y)
    plt.savefig('bend'+str(count)+'.png')
    plt.show()

我已经使用此代码来绘制点。

sub_curvature = []
for i in range(len(smallest_5)):
    a = np.array(smallest_5[i])

    dx_dt = np.gradient(a[:,0])
    dy_dt = np.gradient(a[:,1])
    velocity = np.array([ [dx_dt[i], dy_dt[i]] for i in range(dx_dt.size)])

    ds_dt = np.sqrt(dx_dt * dx_dt + dy_dt * dy_dt)

    tangent = np.array([1/ds_dt] * 2).transpose() * velocity

    tangent_x = tangent[:, 0]
    tangent_y = tangent[:, 1]

    deriv_tangent_x = np.gradient(tangent_x)
    deriv_tangent_y = np.gradient(tangent_y)

    dT_dt = np.array([ [deriv_tangent_x[i], deriv_tangent_y[i]] for i in range(deriv_tangent_x.size)])

    length_dT_dt = np.sqrt(deriv_tangent_x * deriv_tangent_x + deriv_tangent_y * deriv_tangent_y)

    normal = np.array([1/length_dT_dt] * 2).transpose() * dT_dt

    d2s_dt2 = np.gradient(ds_dt)
    d2x_dt2 = np.gradient(dx_dt)
    d2y_dt2 = np.gradient(dy_dt)

    curvature = np.abs(d2x_dt2 * dy_dt - dx_dt * d2y_dt2) / (dx_dt * dx_dt + dy_dt * dy_dt)**1.5
    t_component = np.array([d2s_dt2] * 2).transpose()
    n_component = np.array([curvature * ds_dt * ds_dt] * 2).transpose()

    acceleration = t_component * tangent + n_component * normal

    sub_curvature.append(curvature) 

我使用上面的代码来计算数据上各个点的曲率。在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

以上是我使用数据创建的一些图表。如您所见,第一个没有真正的弯曲,但后两个有一个大弯曲点。我该如何确定这个区域?计算单个点的曲率是否正确,或者我应该查看点滑动窗口上的曲率?谢谢!

标签: pythonnumpycurve-fittingcurve

解决方案


如果我们假设“曲率”是指圆形曲率,那么您将需要一个超过 3 个点的滑动窗口(因为 3 个点确定一个圆)。

对于任意三个点(a,b,c),曲率都是2 * |(a-b) x (b-c)| / (|a-b| * |b-c| * |c-b|)

我们可以得到a-bb-c

ab = smallest_5[1:] - smallest_5[:-1]

a-c来自:

ac = smallest_5[2:] - smallest_5[:-2]

那么平方曲率是:

curv_sq = 4 * (np.cross(ab[1:], ab[:-1])**2).sum() / ((ab[1:]**2).sum() * (ab[:-1]**2).sum() * (ac**2).sum())

由于我们只是在寻找最大曲率,因此我们实际上不必取其平方根。我们可以找到具有最大曲率的点的索引

max_curv_index = np.argmax(curv_sq)

推荐阅读