如何找到数据中存在弯曲/切割的点?

2024-03-29 07:22:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据点:在这个数据列表中有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) 

我使用上面的代码来计算数据上各个点的曲率enter image description hereenter image description hereenter image description here

上面是我用这些数据创建的一些图。如你所见,第一个没有真正的弯曲,但最后两个有一个点,那里有一个大弯曲。我怎样才能确定这个区域?计算单个点的曲率是正确的,还是应该查看点的滑动窗口上的曲率?谢谢你


Tags: 数据infornpdtdstangentarray
2条回答

作为一个想法,您可以找到最小值y,它不是数组y维中的第一个或最后一个值。例如:

s4 = np.array(smallest_5[4]).T # exctract a sub-array
min_y = np.agrmin(s4[1]) # gives 13
min_y == (0 or len(s4[1]-1) # gives False, so the minimum is in the middle of the curve

s0 = np.array(smallest_5[0]).T # exctract a sub-array
min_y = np.agrmin(s0[1]) # gives 16
min_y == (0 or len(s0[1]-1) # gives True, so the minimum is not in the middle of the curve

如果我们假设“曲率”是指圆曲率,那么您需要在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)

相关问题 更多 >