Source code for Hive.utils.seg_mask_utils

import nibabel as nib
from scipy.ndimage import label, generate_binary_structure


[docs]def semantic_segmentation_to_instance(mask_filename: str, output_path: str) -> int: """ Given a semantic segmentation mask convert to instance segmentation and save in the given output path. Return the number of labels in instance segmentation mask. Parameters ---------- mask_filename: File path of semantic segmentation mask. output_path: Output path including new instance segmentation mask file name. Returns ------- Number of labels in converted instance segmentation mask. """ # load segmentation mask and properties mask = nib.load(mask_filename) affine = mask.affine np_mask = mask.get_fdata() # label connected regions in segmentation mask labeled_array, num_features = label(np_mask, structure=generate_binary_structure(3, 3)) thresh = 10 # voxel count in each region from https://neurostars.org/t/roi-voxel-count-using-python/6451 # ignore regions below threshold = 10 for i in range(1, num_features + 1): vox_count = (labeled_array == i).sum() if vox_count < thresh: labeled_array[labeled_array == i] = 0 labeled_array[labeled_array > 0] = 1 labeled_array, num_features = label(labeled_array, structure=generate_binary_structure(3, 3)) # convert labeled array into Nifti file labeled_mask = nib.Nifti1Image(labeled_array, affine=affine) nib.save(labeled_mask, output_path) return num_features