如何在二进制NumPy数组中绘制边界分割簇(3D晶粒边界建模)
3D二进制数组中基于种子点的类球状簇边界生成方案(晶粒边界建模场景)
核心算法思路
1. 距离场等值面法
- 遍历3D二进制数组中所有值为0的体素,计算每个体素到最近种子点的欧氏距离
- 设定距离阈值(可按簇的预期大小设定),将距离等于阈值的体素标记为1(边界);对于相邻簇的公共边界,取距离两个种子点相等的体素作为边界(即Voronoi面的体素化实现)
- 这种方法天然适配类球状簇的需求,因为欧氏距离的等值面就是球面/近似球面
2. 体素化Voronoi胞腔边界提取
- 先通过3D Voronoi剖分得到每个种子点对应的胞腔
- 遍历3D数组中的每个体素,判断其所属的胞腔;若某体素的邻域体素属于不同胞腔,则将该体素标记为1(边界)
- 解决之前Voronoi转平面失败的关键:跳过直接生成平面的步骤,直接在体素网格上判断边界,避免平面与体素网格的适配问题
3. 各向同性区域生长+边界提取
- 从每个种子点出发,向6/26邻域进行各向同性区域生长(优先选择欧氏距离更接近球面的方向),直到达到预设的簇体积
- 生长完成后,提取不同簇之间的相邻体素,标记为1作为边界
实用工具包推荐
- NumPy + SciPy:用
scipy.spatial.Voronoi计算3D Voronoi图,结合NumPy的数组遍历操作,手动实现体素的胞腔归属判断与边界标记,适合自定义需求强的场景 - Open3D:通过
create_from_point_cloud_voronoi生成Voronoi胞腔网格,再用VoxelGrid工具将网格表面离散化为体素,直接输出3D二进制数组,边界体素设为1 - PyVista:支持Voronoi胞腔的快速生成与体素转换,内置的边界提取函数可直接分离簇边界,适配材料科学领域的建模需求
关键注意事项
- 用欧氏距离而非曼哈顿距离计算体素与种子的距离,保证簇的类球状形态
- 处理边界重叠时,避免重复标记同一体素为1,可通过先计算所有簇的区域,再取区域间的交集体素作为边界
- 若目标数组分辨率较低,可先在高分辨率网格上生成边界,再通过下采样得到最终结果,提升边界的平滑度
内容的提问来源于stack exchange,提问作者ogclifford
相关产品推荐
相关产品推荐

