Python中的2D alpha shape / 凹壳问题

4
我有一个大的2D点集,已经被降采样成一个44x2的numpy数组(数组定义在后面)。我正在尝试找到这些点的边界形状,它们实际上是一个凹多边形。在第二张图中,我手动标记了一个近似的边界形状,我希望能得到它。

points points+overlay

我尝试过使用alphashape这里提供的Delauney三角剖分方法,两种方法得出的答案相同。
不幸的是,无论alpha参数如何,我似乎都无法达到所需效果。我已经尝试了一些手动设置和alphaoptimize,以下是其中的一些示例。

alpha=0.1 alpha=0.5 alpha=1.0

我是否对AlphaShape有什么关键的误解?文档似乎非常清晰,但显然我漏掉了一些东西。

import numpy as np
import alphashape
from descartes import PolygonPatch
import matplotlib.pyplot as plt

points = np.array(
[[0.16,3.98],
[-0.48,3.33],
[-0.48,4.53],
[0.1,3.67],
[0.04,5.67],
[-7.94,3.02],
[-18.16,3.07],
[-0.15,5.67],
[-0.26,5.14],
[-0.1,5.11],
[-0.96,5.48],
[-0.03,3.86],
[-0.12,3.16],
[0.32,4.64],
[-0.1,4.32],
[-0.84,4.28],
[-0.56,3.16],
[-6.85,3.28],
[-0.7,3.24],
[-7.2,3.03],
[-1.0,3.28],
[-1.1,3.28],
[-2.4,3.28],
[-2.6,3.28],
[-2.9,3.28],
[-4.5,3.28],
[-12.3,3.28],
[-14.8,3.28],
[-16.7,3.28],
[-17.8,3.28],
[-0,3.03],
[-1,3.03],
[-2.1,3.03],
[-2.8,3.03],
[-3.2,3.03],
[-5,3.03],
[-12,3.03],
[-14,3.03],
[-17,3.03],
[-18,3.03],
[-0.68,4.86],
[-1.26,3.66],
[-1.71,3.51],
[-9.49,3.25]])

alpha = 0.1
alphashape = alphashape.alphashape(points, alpha)

fig = plt.figure()
ax = plt.gca()
ax.scatter(points[:,0],points[:,1])
ax.add_patch(PolygonPatch(alphashape,alpha=0.2))
plt.show()
1个回答

2
您所附加的图表可能会误导,因为x轴和y轴的刻度差异很大。如果将两个轴设置为相同的刻度,您将获得以下图表:point cloud。由于点的x坐标之间的差异平均要比y坐标之间的差异大得多,因此您无法获得类似于所需结果的alpha形状。对于更大的alpha值,沿x轴散布的点将不会通过边缘连接,因为alpha形状将使用太小的圆来连接这些点。对于足够小的alpha值,这些点被连接,您将在图表右侧获得长边缘。您可以通过重新调整所有点的y坐标来解决此问题,从而有效地将图表在垂直方向上拉伸。例如,将y坐标乘以7并设置alpha = 0.4,将获得以下图片:alpha shape

1
这个方法很好用。我最终使用了scikitlearn中的MinMaxScaler,而不是你使用的乘数,因为我需要它具有通用性。我使用geometry.mapping提取了多边形的点,并使用scaler.inverse_transform恢复了原始比例尺。 - shanryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接