使用体素的python高效3d voronoi图

时间:2015-02-01 20:30:04

标签: python voronoi voxel

我正在尝试使用表示体素的3d数组创建Voronoi图,其中坐标由数组的索引表示。 例如:

points = np.random.random([10,3])
vox_len = 0.1
lx = ly = lz = 11
hull_space=np.zeros([lx,ly,lz],dtype=np.int16)
hull_space.fill(-1)
for i in range(lx):
    for j in range(ly):
        for k in range(lz):
            coord = np.array([i,j,k]).astype(float)*vox_len
            diff = points - coord
            dist = np.sqrt(diff[:,0]**2 + diff[:,1]**2 + diff[:,2]**2)
            closest = np.argmin(dist)
            hull_space[i][j][k]=closest

问题是,对于较大的数组,代码非常慢。我也试过了:

grid = np.indices((lx,ly,lz)).astype(float)*vox_len
hull_space = np.ones([lx,ly,lz],dtype=np.int16)
hull_space.fill(-1)
closest_dist = np.ones(hull_space.shape)
closest_dist.fill(999)
for index,point in enumerate(points):
    dist2 = (grid[0]-point[0])**2 + (grid[1]-point[1])**2 + (grid[2]-point[2])**2
    hull_space[dist2 < closest_dist]=index
    closest_dist[dist2 < closest_dist]=dist2[dist2 < closest_dist]

但结果更糟。我知道scipy的voronoi图方法,但我需要建立一个体素图像,以便对voronoi区域的边缘进行距离变换。我的目标是创建一个纠缠纤维结构的图像,用于孔隙网络模型,体素方法可用于获得孔隙体积。

任何使算法运行得更快的帮助都将受到赞赏。对于300x300x300的500点图表,我的机器需要大约50分钟

1 个答案:

答案 0 :(得分:0)

您可以尝试对点进行排序。将坐标视为二进制并对其进行交织。然后两种方式排序。事实上,Cgal使用相同的算法。