[英]Python find the long axis of a 3D point cloud or 3D hull
我试图找到一个 3D 对象(描述为 3D 布尔或标签数组)的“长轴”,它穿过(或靠近)该对象的质心。
我想我可以简单地遍历对象中的每一对点并选择它们之间距离最大的点对,但是在下面的示例对象的情况下,该线不会穿过对象的中心。
同样,我认为我可以计算每对点之间的距离,以找到在距离中心的某个最小距离内通过的最长的一对,但我担心我正在重新发明轮子。 似乎应该有一些最小二乘拟合一条线,但我能够挖掘的唯一解决方案是二维数组。
任何建议将不胜感激。
以下代码显示了一个非常简单的 3D 形状的尺寸。 我真正感兴趣的形状包含数千个点并且更复杂,但相似之处在于 1)两点之间的最大距离可能远离对象的中心,并且 2)它们是连接在一起的,因此它们可以被描述为单个连接的轮廓。
import matplotlib.pyplot as plt
import numpy as np
# make a simple 3D shape
t = [[[0,0,0,0,0],
[0,0,1,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0]],
[[0,0,0,0,0],
[0,0,1,0,0],
[0,1,1,1,0],
[0,0,0,0,0],
[0,0,0,0,0]],
[[0,0,0,0,0],
[0,0,1,0,0],
[0,1,1,1,0],
[0,0,0,0,0],
[0,0,0,0,0]],
[[0,0,0,0,0],
[0,0,1,0,0],
[0,1,1,1,0],
[0,0,0,0,0],
[0,0,0,0,0]],
[[0,0,0,0,0],
[0,0,1,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0]]]
t = np.array(t)
# find the centroid of the object
coords = np.where(t == 1)
x = np.mean(coords[0])
y = np.mean(coords[1])
z = np.mean(coords[2])
# show the object at different angles
fig, (ax1, ax2, ax3) = plt.subplots(1, 3)
ax1.imshow(np.max(t, axis=0))
ax1.plot(x,y, 'ro')
ax1.set_title('xy')
ax2.imshow(np.max(t, axis=1))
ax2.plot(x,z, 'ro')
ax2.set_title('xz')
ax3.imshow(np.max(t, axis=2))
ax3.plot(y,z, 'ro')
ax3.set_title('yz')
plt.show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.