为给定的点云分割上边缘线和下边缘线?

问题描述

我有一个二维点 x,y 的列表。我需要为上下边缘找到一条平滑的曲线(相应的红色和蓝色曲线)。 见下图:a TUI

enter image description here

我找到了一个很好的例子,其中检测到 x,y 点的外边缘。 使用这些我有我的工作:

Enter start number : 2
Enter stop number : 5
2 x 1 = 2   3 x 1 = 3   4 x 1 = 4   5 x 1 = 5   
2 x 2 = 4   3 x 2 = 6   4 x 2 = 8   5 x 2 = 10  
2 x 3 = 6   3 x 3 = 9   4 x 3 = 12  5 x 3 = 15  
2 x 4 = 8   3 x 4 = 12  4 x 4 = 16  5 x 4 = 20  
2 x 5 = 10  3 x 5 = 15  4 x 5 = 20  5 x 5 = 25  
2 x 6 = 12  3 x 6 = 18  4 x 6 = 24  5 x 6 = 30  
2 x 7 = 14  3 x 7 = 21  4 x 7 = 28  5 x 7 = 35  
2 x 8 = 16  3 x 8 = 24  4 x 8 = 32  5 x 8 = 40  
2 x 9 = 18  3 x 9 = 27  4 x 9 = 36  5 x 9 = 45  
2 x 10 = 20 3 x 10 = 30 4 x 10 = 40 5 x 10 = 50 
2 x 11 = 22 3 x 11 = 33 4 x 11 = 44 5 x 11 = 55 
2 x 12 = 24 3 x 12 = 36 4 x 12 = 48 5 x 12 = 60 

现在点云是黑色的。蓝线是从上面的算法中获得的。 Here

更新: 起点和终点可以选择最左边的点(或者手动没问题) 我期待以下结果:

computed edge

解决方法

您可以使用以下事实(请参阅 scipy.spatial.Delaunay documentation) “对于二维,三角形点是逆时针方向的”。 因此,在 Alpha 形状中构建的外边缘点将始终逆时针方向,即形状的内侧将在其左侧(如果文档中未证明这一点,我们可以自己检查并在必要时翻转,但是这里不需要)。

这意味着沿多边形的最左边点和最右边点之间的点是下壳,最右边和最左边之间的点是上壳。下面的代码实现了这个想法。

min_x_ind = np.argmin(edge_points[:,0])
max_x_ind = np.argmax(edge_points[:,0])
if min_x_ind < max_x_ind:
    lower_hull = edge_points[min_x_ind:max_x_ind+1,:]
    upper_hull = np.concatenate([edge_points[max_x_ind:,:],edge_points[:min_x_ind+1,:]])
else:
    upper_hull = edge_points[max_x_ind:min_x_ind+1,:]
    lower_hull = np.concatenate([edge_points[min_x_ind:,edge_points[:max_x_ind+1,:]])

结果可以通过以下方式可视化:

plt.plot(upper_hull[:,0],upper_hull[:,1],"r",lw=3)
plt.plot(lower_hull[:,lower_hull[:,"b",lw=3)

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...