Python 中的二维 alpha 形状/凹包问题
2D alpha shape / concave hull problem in Python
我有一大组 2D 点,我已将它们下采样到 44x2 numpy 数组(稍后定义的数组)中。我试图找到那些实际上是凹包的点的边界形状。在第二张图片中,我手动标记了我希望获得的近似边界形状。
我试过使用 alphashape and the Delauney triangulation method from here,两种方法提供相同的答案。
不幸的是,无论 alpha 参数如何,我似乎都无法实现我所需要的。我尝试了一些手动设置和 alphaoptimize,下面是一些示例。
我对 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()
您所附的图表具有误导性,因为 x 轴和 y 轴上的刻度非常不同。如果将两个轴设置为相同的比例,您将获得以下图:
.
由于点的 x 坐标之间的差异平均比 y 坐标之间的差异大得多,因此您无法获得类似于您想要的结果的 alpha 形状。对于较大的 alpha 值,沿 x 轴散布的点将不会被边缘连接,因为 alpha 形状将使用太小的圆来连接这些点。对于足够小的 alpha 值以连接这些点,您将在图的右侧获得长边。
您可以通过重新缩放所有点的 y 坐标来解决此问题,从而有效地在垂直方向上拉伸绘图。比如y坐标乘以7,设置alpha = 0.4
得到下图:
我有一大组 2D 点,我已将它们下采样到 44x2 numpy 数组(稍后定义的数组)中。我试图找到那些实际上是凹包的点的边界形状。在第二张图片中,我手动标记了我希望获得的近似边界形状。
我试过使用 alphashape and the Delauney triangulation method from here,两种方法提供相同的答案。
不幸的是,无论 alpha 参数如何,我似乎都无法实现我所需要的。我尝试了一些手动设置和 alphaoptimize,下面是一些示例。
我对 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()
您所附的图表具有误导性,因为 x 轴和 y 轴上的刻度非常不同。如果将两个轴设置为相同的比例,您将获得以下图:
由于点的 x 坐标之间的差异平均比 y 坐标之间的差异大得多,因此您无法获得类似于您想要的结果的 alpha 形状。对于较大的 alpha 值,沿 x 轴散布的点将不会被边缘连接,因为 alpha 形状将使用太小的圆来连接这些点。对于足够小的 alpha 值以连接这些点,您将在图的右侧获得长边。
您可以通过重新缩放所有点的 y 坐标来解决此问题,从而有效地在垂直方向上拉伸绘图。比如y坐标乘以7,设置alpha = 0.4
得到下图: