返回

3D网格骨架提取:超越距离变换,助力骨骼分析

python

从 3D 网格中提取骨架:超越距离变换

引言

距离变换在图像处理中广泛应用,用于计算图像中每个像素到最近非零像素的距离。虽然它在某些应用中非常有用,但在提取 3D 网格骨架方面却显得力不从心。本文探讨了距离变换在骨架提取中的局限性,并介绍了更适合此任务的其他骨架化算法。

距离变换的局限性

scipy.ndimage.distance_transform_edt 函数用于计算欧几里德距离变换,即每个像素到最近非零像素的欧几里德距离。对于 3D 网格,此距离变换生成一个距离图,其中每个体素的值表示到最近网格表面的距离。然而,这并不会产生骨架,而是整个体积。

骨架化算法

为了从 3D 网格中提取骨架,可以使用更适合此任务的骨架化算法。这些算法通常分为两种类型:

  • 细化算法: 迭代地移除体素,直到只剩下骨架。
  • 距离变换骨架化算法: 使用距离变换计算网格中每个体素到最近骨架点的距离,然后利用该信息识别和提取骨架。

推荐算法

以下算法是提取 3D 网格骨架的理想选择:

  • Skeletonize3D (MATLAB):基于细化算法,生成准确且连贯的骨架。
  • Medial Axis Transform(MAT) (Python):基于距离变换,产生具有良好拓扑特性的骨架。
  • GPU-Accelerated Thinning Algorithm (C++):利用 GPU 加速的基于细化的算法,提高性能。

代码示例

以下是用 Skeletonize3D 从 3D 网格中提取骨架的 MATLAB 代码示例:

% 加载网格
mesh = load_mesh('mesh.obj');

% 计算骨架
skeleton = skeletonize3d(mesh);

% 可视化骨架
figure;
plot3(skeleton(:,1), skeleton(:,2), skeleton(:,3), 'b-');
xlabel('x');
ylabel('y');
zlabel('z');
title('骨架');

结论

距离变换虽然是一种强大的技术,但并不适用于提取 3D 网格骨架。本文介绍了细化和距离变换骨架化算法等更合适的骨架化算法,并提供了代码示例,以帮助读者从 3D 网格中提取准确的骨架。

常见问题解答

  1. 距离变换和骨架提取之间有什么区别?
    距离变换计算图像中每个像素到最近非零像素的距离,而骨架提取则识别和提取网格中的骨架,即网格中表示物体中心线的线状结构。

  2. 哪种骨架化算法最适合我的应用?
    选择骨架化算法取决于具体应用要求。对于准确性和连贯性,Skeletonize3D 是一个不错的选择,而 MAT 和 GPU-Accelerated Thinning Algorithm 则在性能方面脱颖而出。

  3. 如何评估骨架提取算法的性能?
    骨架提取算法的性能可以通过衡量骨架的准确性(与实际骨架的相似程度)、连贯性(骨架段之间的连接性)和完整性(骨架覆盖物体中心线的程度)来评估。

  4. 如何使用骨架提取结果?
    骨架提取结果可用于各种应用,例如形状分析、骨骼建模和医疗图像分割。

  5. 骨架提取还有什么其他方法?
    除了本文讨论的算法之外,还有其他骨架提取方法,例如基于图论的方法和基于学习的方法。