Source code for dipy.segment.utils

import warnings

import numpy as np
from scipy.ndimage import label


[docs] def remove_holes_and_islands( binary_img, *, remove_holes=True, remove_islands=True, slice_wise=False ): """ Remove any small mask chunks or holes that could be in the segmentation output. Parameters ---------- binary_img : np.ndarray Binary image slice_wise : bool, optional Whether to run slice wise background correction as well remove_holes : bool, optional Whether to remove holes from the binary image remove_islands : bool, optional Whether to remove islands from the binary image Returns ------- largest_img : np.ndarray """ n_unique = len(np.unique(binary_img)) if n_unique <= 1: return binary_img if n_unique > 2: warnings.warn( "The mask is not binary. \ Returning the original mask", UserWarning, stacklevel=2, ) return binary_img if not remove_holes and not remove_islands: warnings.warn( "Both remove_holes and remove_islands is False. \ Returning the original mask", UserWarning, stacklevel=2, ) return binary_img shape = binary_img.shape new_binary_img = binary_img.copy() if remove_islands: components, _ = label(new_binary_img) new_binary_img = components == np.argmax(np.bincount(components.flat)[1:]) + 1 new_binary_img = new_binary_img.astype(int) if remove_holes: components, _ = label(1 - new_binary_img) new_binary_img = components == np.argmax(np.bincount(components.flat)[1:]) + 1 new_binary_img = 1 - new_binary_img.astype(int) if slice_wise: for x in range(shape[0]): components, _ = label(1 - new_binary_img[x]) temp = components == np.argmax(np.bincount(components.flat)[1:]) + 1 new_binary_img[x] = 1 - temp.astype(int) for y in range(shape[1]): components, _ = label(1 - new_binary_img[:, y]) temp = components == np.argmax(np.bincount(components.flat)[1:]) + 1 new_binary_img[:, y] = 1 - temp.astype(int) for z in range(shape[2]): components, _ = label(1 - new_binary_img[..., z]) temp = components == np.argmax(np.bincount(components.flat)[1:]) + 1 new_binary_img[..., z] = 1 - temp.astype(int) return new_binary_img