Isomap manifold non‐self‐intersecting surface meshes in high curvature regions - JamesDarby345/Volumetric_Instance_to_Mesh GitHub Wiki
The front back average approach makes the assumption that the volumetric data can be effectively projected to a plane within a single cube, and this holds for most of the data. But high curvature regions like cube '01744_02256_04048' break this assumption as seen in the below picture:
Since the front back average projects to a plane along an axis, when the data curves over itself on that plane the resulting midline volume ends up in space between the data, resulting in a bad mesh.
To address this a new direct volumetric data to surface mesh file, Isomap_surface_recon.py has been added. It converts the volumetric data into a downsampled point cloud, uses PCA analysis to find the best surface normal estimate, then uses a camera point projected from the normal to find the 'visible surface' of the point cloud, effectively dealing with regions of high curvature. This finds the inner surface of the volumetric label. Then to mesh the surface point cloud, isomap is used to flatten the point cloud, then delauney 2d creates the connections. This will create manifold meshes, except at the boundary, and is also prone to creating self intersecting meshes. A self intersection check is performed and by iteratively downsampling the isomap, a non-self-intersecting mesh is found. The results on cube '01744_02256_04048' is pictured below:
An advantage of this method is due to the downsampling of the point cloud, it could overcome the obj merging across cubes by loading all the volumetric data with the same label as downsampled point clouds and calculating the surface in one go.
The default values of the downsample factor and alpha factor work well with the cube dataset, but they are critical to get to reasonable values. --ds_factor controls the size of the voxel downsampling of the point cloud, and --alpha_factor controls the maximum edge length delauney_2d will make. If the alpha is too big, it will connect edges across curves erroneously, too small and the mesh will have holes in it.