Example of watershed in slamΒΆ

# Authors:
# Lucile Hashimoto lucile-hashimoto
# Guillaume Auzias <guillaume.auzias@univ-amu.fr>

# License: MIT
# sphinx_gallery_thumbnail_number = 2
NOTE: there is no visualization tool in slam, but we provide at the

end of this script exemplare code to do the visualization with an external solution


importation of slam modules

import slam.io as sio
import slam.watershed as swat
import slam.sulcal_graph as ssg

loading an examplar mesh and corresponding texture

path_to_mesh = "../examples/data/example_mesh.gii"
path_to_mask = ""
path_to_output = ""

mesh = sio.load_mesh(path_to_mesh)
side = "left"

compute curvature, dpf and voronoi

_, dpf, voronoi = swat.compute_mesh_features(mesh, save=False, outdir=path_to_output, check_if_exist=True)

normalize watershed thresholds

thresh_dist, thresh_ridge, thresh_area = swat.normalize_thresholds(mesh, voronoi,
                                                                   thresh_dist=20.0,
                                                                   thresh_ridge=1.5,
                                                                   thresh_area=50.0,
                                                                   side=side)
        Computing the Fiedler geodesic length and surface area

  Computing Laplacian
    Computing mesh weights of type fem
    -edge length threshold needed for  0  values =  0.0  %
    -number of Nan in weights:  0  =  0.0  %
    -number of Negative values in weights:  936  =  6.706792777300086  %
    -nb Nan in Laplacian :  0
    -nb Inf in Laplacian :  0
Fielder length [76.42611449]
Distance threshold : [6.47816186]

define the exclusion mask (cingular pole)

if path_to_mask:
    mask = sio.load_texture(path_to_mask).darray[0]
else:
    mask = None

extract sulcal pits and associated basins

basins, ridges, adjacency = swat.watershed(mesh, voronoi, dpf, thresh_dist, thresh_ridge, thresh_area, mask)
Computing watershed by flooding...
Distance between 2 pits: [6.47816186] mm - Ridge height: 1.5 mm
Number of basins found: 3
nb of basins to remove: 0

generate the textures from watershed outputs

tex_labels, tex_pits, tex_ridges = swat.get_textures_from_dict(mesh, basins, ridges, save=True, outdir=path_to_output)

generate the sulcal graph

g = ssg.get_sulcal_graph(adjacency, basins, ridges, save=True, outdir=path_to_output)
{'ridge_index': np.int64(1456), 'ridge_depth': np.float32(-0.001474528), 'ridge_length': 105}
{'ridge_index': np.int64(1582), 'ridge_depth': np.float32(0.017893096), 'ridge_length': 64}
{'ridge_index': np.int64(1425), 'ridge_depth': np.float32(-0.0014448662), 'ridge_length': 105}
{'ridge_index': np.int64(1852), 'ridge_depth': np.float32(-0.031923838), 'ridge_length': 39}
{'ridge_index': np.int64(1624), 'ridge_depth': np.float32(0.018081363), 'ridge_length': 64}
{'ridge_index': np.int64(1910), 'ridge_depth': np.float32(-0.031930108), 'ridge_length': 39}
Edge 0 attributes: dict_keys(['weight'])
Edge 1 attributes: dict_keys(['weight'])
Edge 2 attributes: dict_keys(['weight'])
Edge 0 attributes: dict_keys(['weight', 'ridge_index', 'ridge_depth', 'ridge_length'])
Edge 1 attributes: dict_keys(['weight', 'ridge_index', 'ridge_depth', 'ridge_length'])
Edge 2 attributes: dict_keys(['weight', 'ridge_index', 'ridge_depth', 'ridge_length'])
Graph saved in graph.gpickle

generate the textures from graph

tex_labels, tex_pits, tex_ridges = ssg.get_textures_from_graph(g, mesh, save=True, outdir=path_to_output)

Total running time of the script: (0 minutes 0.290 seconds)

Gallery generated by Sphinx-Gallery