估算凸壳的纵横比

11

有什么好的方法可以在Python中估计凸包的纵横比?我已经尝试使用椭圆拟合凸包的顶点,并取半轴和主轴的比值。然而结果不太满意,所以现在我正在研究如何直接从凸包中推导出纵横比。如果您有任何想法或解决方案,将不胜感激。

谢谢!


在这个环境中,"aspect ratio" 是什么意思?您想如何直接从凸包中推导出它? - Christian Rau
1
你如何定义凸包的长宽比?你想允许不同的角度,以便获得旋转矩形的长宽比吗?如果你只想使用0°和90°作为轴线,那么长宽比很容易计算。 - Christian Semrau
你所说的0度和90度,是指根据以下方式找到纵横比吗?1)在凸包中找到主轴(通过重心的凸包中最长的可能路径),2)测量与主轴正交的次要轴。如果是这样的话,那么它应该可以工作。 - ebressert
这不是我所指的0°和90°(仅仅是查看外壳点的x轴范围和y轴范围,即在轴平行矩形中包含外壳)。但是您给出了您可能正在寻找的定义,以及算法(可能是最优的,也可能不是)。 - Christian Semrau
1个回答

12
通常,您会找到点云协方差矩阵的特征向量。纵横比是最大和最小特征值之比。
举个例子,对于一堆随机点(您只需将相同的方法应用于凸包,但使用顶点):
import matplotlib.pyplot as plt
import numpy as np

# Random data
num = 100
xy = np.random.random((2,num)) + 0.01 * np.arange(num)

eigvals, eigvecs = np.linalg.eig(np.cov(xy))

fig, (ax1, ax2) = plt.subplots(nrows=2)
x,y = xy
center = xy.mean(axis=-1)
for ax in [ax1, ax2]:
    ax.plot(x,y, 'ro')
    ax.axis('equal')

for val, vec in zip(eigvals, eigvecs.T):
    val *= 2
    x,y = np.vstack((center + val * vec, center, center - val * vec)).T
    ax2.plot(x,y, 'b-', lw=3)

plt.show()

enter image description here


1
这是一个不错的解决方案。我仍在我的数据上测试这段代码,但到目前为止结果很好。谢谢! - ebressert

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