如何使用CGAL或其他工具填充图像分割生成的3D网格孔洞?
解决方案
CGAL内置修复方案
你可以通过CGAL现有模块直接修复孔洞问题,分为两种处理路径:
路径1:调整现有网格生成流程减少伪孔洞
你当前的网格生成参数和优化项设置不全,大部分边界孔洞可通过参数优化直接消除:
- 调小
facet_distance参数值:该参数控制网格表面与原始分割边界的贴合误差,适当下调(建议下调当前值的30%~50%)可避免因贴合精度不足产生的缝隙类伪孔洞。 - 补充网格后处理优化项:你当前仅启用了
lloyd()优化,可叠加odt()、perturb()、exude()优化参数,自动修正非流形边、小缝隙等常见缺陷,修改后的生成代码示例:
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria, lloyd(), odt(), perturb(), exude());
路径2:显式填充已生成网格的孔洞
如果调整参数后仍存在孔洞,可通过CGAL的Polygon_mesh_processing模块执行显式填充:
- 从C3t3对象中按组织标签提取对应表面三角网格,可调用
CGAL::output_surface_facets_to_polyhedron()接口按标签筛选输出。 - 对每个组织的独立表面网格调用
CGAL::Polygon_mesh_processing::fill_holes(),可通过设置最大孔洞边界边长阈值,避免误填充正常的解剖结构凹槽。 - 填充后对表面做质量优化,可使用
CGAL::Polygon_mesh_processing::triangulate_faces()、CGAL::Polygon_mesh_processing::fair()等函数修正填充区域的网格质量。 - 将优化后的多组织表面作为输入域,重新生成无孔洞的四面体网格。
替代修复方案
如果不想在CGAL中修改代码,也可以使用通用工具快速修复:
- ParaView:直接导入.vtu格式网格,使用内置的
Fill Holes过滤器,设置最大孔洞尺寸参数即可一键填充,操作门槛极低,适合快速验证效果。 - 3D Slicer:导入原始分割结果后,使用Surface Toolbox模块执行孔洞填充、表面平滑,再导出四面体网格,适配医学影像分割的常见噪声问题。
- Gmsh:导入现有网格或原始分割表面,调用内置的孔洞填充和网格优化功能,直接输出符合有限元计算要求的网格。
内容的提问来源于stack exchange,提问作者arma
相关产品推荐
相关产品推荐

