def __dilate_mask__( self, mask_path: str, temp_path: str, dil_rate: float = preferences.mask_dilation_rate, dil_threshold: float = preferences.mask_dilation_threshold, ): """Dilate mask using gaussian blur and write to disk to use with Elastix. Args: mask_path (str | MedicalVolume): File path for mask or mask to use to use as focus points for registration. Mask must be binary. temp_path (str): Directory path to store temporary data. dil_rate (`float`, optional): Dilation rate (sigma). Defaults to ``preferences.mask_dilation_rate``. dil_threshold (`float`, optional): Threshold to binarize dilated mask. Must be between [0, 1]. Defaults to ``preferences.mask_dilation_threshold``. Returns: str: File path of dilated mask. Raises: FileNotFoundError: If `mask_path` not valid file. ValueError: If `dil_threshold` not in range [0, 1]. """ if dil_threshold < 0 or dil_threshold > 1: raise ValueError("'dil_threshold' must be in range [0, 1]") if isinstance(mask_path, MedicalVolume): mask = mask_path elif os.path.isfile(mask_path): mask = fio_utils.generic_load(mask_path, expected_num_volumes=1) else: raise FileNotFoundError("File {} not found".format(mask_path)) dilated_mask = (sni.gaussian_filter(np.asarray(mask.volume, dtype=np.float32), sigma=dil_rate) > dil_threshold) fixed_mask = np.asarray(dilated_mask, dtype=np.int8) fixed_mask_filepath = os.path.join(io_utils.mkdirs(temp_path), "dilated-mask.nii.gz") dilated_mask_volume = MedicalVolume(fixed_mask, affine=mask.affine) dilated_mask_volume.save_volume(fixed_mask_filepath) return fixed_mask_filepath
def test_4d(self): vol = np.stack([np.ones((10, 20, 30)), 2 * np.ones((10, 20, 30))], axis=-1) mv = MedicalVolume(vol, self._AFFINE) assert mv.orientation == ("SI", "AP", "LR") assert mv.shape == (10, 20, 30, 2) assert np.all(mv[..., 0].volume == 1) assert np.all(mv[..., 1].volume == 2) ornt = ("AP", "IS", "RL") mv2 = mv.reformat(ornt) assert mv2.orientation == ornt assert mv2.shape == (20, 10, 30, 2) mv2 = mv.reformat(ornt).reformat(mv.orientation) assert mv2.is_identical(mv) fp = os.path.join(self._TEMP_PATH, "test_4d.nii.gz") mv.save_volume(fp) mv2 = NiftiReader().load(fp) assert mv2.is_identical(mv)