CorpusCallosum.shape.mesh

class CorpusCallosum.shape.mesh.CCMesh(vertices, faces, vertex_values=None)[source]

A class for representing and manipulating corpus callosum (CC) meshes.

This class extends lapy.TriaMesh to provide specialized functionality for working with corpus callosum meshes, including contour management, thickness measurements, and visualization capabilities.

The mesh can be constructed from a series of 2D contours representing slices of the corpus callosum, with optional thickness measurements at various points along these contours.

Attributes

v

(np.ndarray) Vertex coordinates of the mesh.

t

(np.ndarray) Triangle indices of the mesh.

mesh_vertex_colors

(np.ndarray) Vertex values for each vertex (CC thickness values)

Methods

area()

Compute the total surface area of triangle mesh.

avg_edge_length()

Compute the average edge length of the mesh.

boundary_loops()

Compute boundary loops of the mesh.

centroid()

Compute centroid of triangle mesh as a weighted average of triangle centers.

connected_components()

Compute connected components of the mesh.

construct_adj_dir_tidx()

Construct directed adjacency matrix (edge graph) of triangle mesh.

curvature([smoothit])

Compute various curvature values at vertices.

curvature_tria([smoothit])

Compute min and max curvature and directions on triangle faces.

edges([with_boundary])

Compute vertices and adjacent triangle ids for each edge.

euler()

Compute the Euler Characteristic.

from_contours(contours[, lr_center, closed, ...])

Create a surface mesh by triangulating between consecutive contours.

get_vertices([original_dim])

Get mesh vertices.

has_free_vertices()

Check if the vertex list has more vertices than what is used in triangles.

is_2d()

Check if the mesh was created with 2D vertices.

is_closed()

Check if triangle mesh is closed (no boundary edges).

is_manifold()

Check if triangle mesh is manifold (no edges with >2 triangles).

is_oriented()

Check if triangle mesh is oriented.

keep_largest_connected_component_([clean])

Keep only the largest connected component of the mesh.

level_length(vfunc, level)

Compute the length of level sets.

level_path(vfunc, level[, get_tria_idx, ...])

Extract levelset of vfunc at a specific level as a path of 3D points.

map_tfunc_to_vfunc(tfunc[, weighted])

Map triangle function to vertices by attributing 1/3 to each vertex.

map_vfunc_to_tfunc(vfunc)

Map vertex function to triangles by averaging vertex values.

normal_offset_(d)

Move vertices along their normals by distance d.

normalize_()

Normalize TriaMesh to unit surface area and centroid at the origin.

orient_()

Re-orient triangles of manifold mesh to be consistent.

plot_mesh([output_path, colormap, ...])

Plot the mesh using Plotly for better performance and interactivity.

read_fssurf(filename)

Load triangle mesh from FreeSurfer surface geometry file.

read_off(filename)

Load triangle mesh from OFF txt file.

read_vtk(filename)

Load triangle mesh from VTK txt file.

refine_([it])

Refine the triangle mesh by placing new vertex on each edge midpoint.

rm_free_vertices_()

Remove unused (free) vertices.

smooth_([iterations])

Smooth the mesh while preserving the z-coordinates.

smooth_laplace([vfunc, n, lambda_, mat])

Smooth the mesh or a vertex function using Laplace smoothing.

smooth_taubin([vfunc, n, lambda_, mu])

Smooth the mesh or a vertex function using Taubin smoothing.

smooth_vfunc(vfunc[, n])

Smooth the mesh or a vertex function iteratively.

snap_cc_picture(output_path[, fssurf_file, ...])

Snap a picture of the corpus callosum mesh.

to_vox_coordinates(mesh_ras2vox)

Convert mesh coordinates to FreeSurfer coordinate system.

tria_areas()

Compute the area of triangles using Heron's formula.

tria_normals()

Compute triangle normals.

tria_qualities()

Compute triangle quality for each triangle in mesh.

vertex_areas()

Compute the area associated to each vertex (1/3 of one-ring trias).

vertex_degrees()

Compute the vertex degrees (number of edges at each vertex).

vertex_normals()

Compute vertex normals.

volume()

Compute the volume of closed triangle mesh, summing tetrahedra at origin.

write_fssurf(filename[, image])

Save as Freesurfer Surface Geometry file (wrap Nibabel).

write_morph_data(filename)

Write the thickness values as a FreeSurfer overlay file.

write_vtk(filename)

Save mesh as VTK file.

classmethod from_contours(contours, lr_center=0, closed=False, smooth=0)[source]

Create a surface mesh by triangulating between consecutive contours.

Parameters:
contourslist[CCContour]

List of CCContour objects to create mesh from.

lr_centerfloat, default=0

Center position in the left-right axis.

closedbool, default=False

Whether to create a closed mesh by adding caps.

smoothint, default=0

Number of smoothing iterations to apply.

Returns:
CCMesh

The joined CCMesh object.

Raises:
Warning

If no valid contours are found.

Notes

The function: 1. Filters out None contours. 2. Calculates z-coordinates for each slice. 3. Creates triangles between adjacent contours. 4. Optionally: - Creates caps at both ends. - Applies smoothing. - Colors caps based on thickness values.

plot_mesh(output_path=None, colormap='red_to_yellow', thickness_overlay=True, show_grid=False, color_range=None, legend='', threshold=None)[source]

Plot the mesh using Plotly for better performance and interactivity.

Creates an interactive 3D visualization of the mesh with optional features like thickness overlay, contour display, and grid visualization.

Parameters:
output_pathPath, str, optional

Path to save the plot. If None, displays the plot interactively.

colormapstr, optional

Which colormap to use, by default “red_to_yellow”. Options: - “red_to_blue”: Red -> Orange -> Grey -> Light Blue -> Blue - “red_to_yellow”: Red -> Yellow -> Light Blue -> Blue - “yellow_to_red”: Yellow -> Light Blue -> Blue -> Red - “blue_to_red”: Blue -> Light Blue -> Grey -> Orange -> Red

thickness_overlaybool, optional

Whether to overlay thickness values on the mesh, by default True.

show_contoursbool, optional

Whether to show the contours, by default False.

show_gridbool, optional

Whether to show the grid, by default False.

color_rangetuple[float, float], optional

Fixed range (min, max) for the colorbar, by default None.

show_mesh_edgesbool, optional

Whether to show the mesh edges, by default False.

legendstr, optional

Legend text for the colorbar, by default “”.

thresholdtuple[float, float], optional

Values between these thresholds will be shown in grey, by default None.

Notes

The plot can be saved to an HTML file or displayed in a web browser.

smooth_(iterations=1)[source]

Smooth the mesh while preserving the z-coordinates.

Parameters:
iterationsint, optional

Number of smoothing iterations, by default 1.

Notes

The function: 1. Stores original z-coordinates. 2. Applies Laplacian smoothing to x and y coordinates. 3. Restores original z-coordinates to maintain slice structure.

snap_cc_picture(output_path, fssurf_file=None, overlay_file=None, ref_image=None)[source]

Snap a picture of the corpus callosum mesh.

Parameters:
output_pathPath, str

Path where to save the snapshot image.

fssurf_filePath, str, optional

Path to a FreeSurfer surface file to use for the snapshot. If None, the mesh is saved to a temporary file.

overlay_filePath, str, optional

Path to a FreeSurfer overlay file to use for the snapshot. If None, the mesh is saved to a temporary file.

ref_imagePath, str, nibabelImage, optional

Path to reference image to use for tkr creation. If None, ignores the file for saving.

Raises:
Warning

If the mesh has no faces and cannot create a snapshot.

Notes

The function: 1. Creates temporary files for mesh and overlay data if needed. 2. Uses whippersnappy to create a snapshot with: - Custom view matrix for standard orientation. - Ambient lighting and colorbar settings. - Thickness overlay if available. 3. Cleans up temporary files after use.

to_vox_coordinates(mesh_ras2vox)[source]

Convert mesh coordinates to FreeSurfer coordinate system.

Parameters:
mesh_ras2voxAffineMatrix4x4

Transformation matrix from midplane mesh space (RAS centered on midplane) to voxel coordinates.

Returns:
CCMesh

A CCMesh object with vertices reoriented to FreeSurfer coordinates.

Notes

Mesh coordinates are in ASR (Anterior-Superior-Right) orientation, with the coordinate system origin on the midslice. The function first transforms from midslice ASR to LIA vox coordinates.

write_fssurf(filename, image=None)[source]

Save as Freesurfer Surface Geometry file (wrap Nibabel).

Parameters:
filenamestr

Filename to save to.

imagestr, object, None

Path to image, nibabel image object, or image header. If specified, the vertices are assumed to be in voxel coordinates and are converted to surface RAS (tkr) coordinates before saving. The expected order of coordinates is (x, y, z) matching the image voxel indices in nibabel.

Raises:
IOError

If file cannot be written.

ValueError

If image header cannot be processed.

Notes

The surface RAS (tkr) transform is obtained from a header that implements get_vox2ras_tkr() (e.g., MGHHeader). For other header types (NIfTI1/2, Analyze/SPM, etc.), we attempt conversion via MGHHeader.from_header.

Also creates parent directory if needed before writing the file.

write_morph_data(filename)[source]

Write the thickness values as a FreeSurfer overlay file.

Parameters:
filenamePath, str

Path where to save the overlay file.

Notes

Creates parent directory if needed before writing the file.

CorpusCallosum.shape.mesh.make_triangles_between_contours(contour1, contour2)[source]

Create a triangular mesh between two contours using a robust method.

Parameters:
contour1np.ndarray

First contour points of shape (N, 2).

contour2np.ndarray

Second contour points of shape (M, 2).

Returns:
np.ndarray

Array of triangle indices of shape (K, 3) where K is the number of triangles.

Notes

The function: 1. Finds closest point on contour2 to first point of contour1 2. Creates triangles by connecting corresponding points 3. Handles contours with different numbers of points 4. Creates two triangles to form a quad between each pair of points