2

我有一大组 2D 点,我已将其下采样为 44x2 numpy 数组(稍后定义的数组)。我试图找到那些实际上是凹壳的点的边界形状。在第二张图片中,我手动标记了我希望获得的近似边界形状。

积分 点+叠加

我已经尝试从这里使用alphashape和 Delauney 三角测量方法,这两种方法都提供了相同的答案。

不幸的是,无论 alpha 参数如何,我似乎都无法实现我所需要的。我尝试了一些手动设置和 alphaoptimize,下面是其中的一些示例。

阿尔法=0.1 阿尔法=0.5 阿尔法=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()
4

1 回答 1

1

您附加的图具有误导性,因为 x 轴和 y 轴上的比例非常不同。如果将两个轴设置为相同的比例,您将获得以下图:

点云.

由于点的 x 坐标之间的差异平均远大于 y 坐标之间的差异,因此您无法获得类似于所需结果的 alpha 形状。对于沿 x 轴散布的较大值的 alpha 点,将不会通过边缘连接,因为 alpha 形状将使用太小的圆圈来连接这些点。对于足够小以使这些点连接起来的 alpha 值,您将获得绘图右侧的长边。

您可以通过重新调整所有点的 y 坐标来解决此问题,从而有效地在垂直方向上拉伸绘图。例如,将 y 坐标乘以 7 并设置alpha = 0.4如下图:

阿尔法形状

于 2021-09-15T03:57:27.367 回答