def testPeel(self): a = np.ones((5, 5, 5), dtype=int) peeledA = peelVolume3D(a) correctPeeling = np.zeros_like(a) correctPeeling[1:-1, 1:-1, 1:-1] = 1 assert (peeledA == correctPeeling).all() m = np.zeros((6, 6, 6), dtype=int) m[1:-1, 1:-1, 1:-1] = 1
def parcellate_voronoi_vol(mask, nb_parcels, seeds=None): """ Produce a parcellation from a Voronoi diagram built on random seeds. The number of seeds is equal to the nb of parcels. Seed are randomly placed within the mask, expect on edge positions Args: - mask (numpy.ndarray): binary 3D array of valid position to parcellate - nb_parcels (int): the required number of parcels - seeds: TODO Return: - the parcellation (numpy.ndarray): a 3D array of integers - """ parcellation = np.zeros(mask.shape, dtype=int) nvox = (mask !=0).sum() for cc_mask in mg.split_mask_into_cc_iter(mask!=0): # compute the required number of parcels within the current CC: size_cc = cc_mask.sum() cc_np = max(int(np.round(nb_parcels * size_cc / (nvox*1.))), 1) pyhrf.verbose(2, 'Treating a connected component (CC) of %d positions' \ %cc_mask.sum()) if cc_mask.sum() < 6: continue if seeds is None: # perform voronoi on random seeds eroded_mask = peelVolume3D(cc_mask) eroded_mask_size = eroded_mask.sum() if eroded_mask_size < nb_parcels: #do no erode, mask too small eroded_mask_size = nvox eroded_mask = mask.copy() cc_seeds = np.random.randint(0,eroded_mask_size, cc_np) mask_for_seed = np.zeros(eroded_mask_size, dtype=int) mask_for_seed[cc_seeds] = 1 mask_for_seed = expand_array_in_mask(mask_for_seed, eroded_mask) else: mask_for_seed = seeds * cc_mask pyhrf.verbose(2, 'Nb of seeds in current CC: %d' \ %mask_for_seed.sum()) cc_parcellation = voronoi(np.vstack(np.where(cc_mask)).T, np.vstack(np.where(mask_for_seed)).T) + 1 pyhrf.verbose(3, 'CC parcellation labels: %s' \ %str(np.unique(cc_parcellation))) maxp = parcellation.max() parcellation += expand_array_in_mask(cc_parcellation + maxp, cc_mask) pyhrf.verbose(3, 'Current parcellation labels: %s' \ %str(np.unique(parcellation))) pyhrf.verbose(1, 'voronoi parcellation: %s, %s' \ %(str(parcellation.shape), str(parcellation.dtype))) return parcellation
def parcellate_voronoi_vol(mask, nb_parcels, seeds=None): """ Produce a parcellation from a Voronoi diagram built on random seeds. The number of seeds is equal to the nb of parcels. Seed are randomly placed within the mask, expect on edge positions Args: - mask (numpy.ndarray): binary 3D array of valid position to parcellate - nb_parcels (int): the required number of parcels - seeds: TODO Return: - the parcellation (numpy.ndarray): a 3D array of integers - """ parcellation = np.zeros(mask.shape, dtype=int) nvox = (mask != 0).sum() for cc_mask in mg.split_mask_into_cc_iter(mask != 0): # compute the required number of parcels within the current CC: size_cc = cc_mask.sum() cc_np = max(int(np.round(nb_parcels * size_cc / (nvox * 1.))), 1) logger.info('Treating a connected component (CC) of %d positions', cc_mask.sum()) if cc_mask.sum() < 6: continue if seeds is None: # perform voronoi on random seeds eroded_mask = peelVolume3D(cc_mask) eroded_mask_size = eroded_mask.sum() if eroded_mask_size < nb_parcels: # do no erode, mask too small eroded_mask_size = nvox eroded_mask = mask.copy() cc_seeds = np.random.randint(0, eroded_mask_size, cc_np) mask_for_seed = np.zeros(eroded_mask_size, dtype=int) mask_for_seed[cc_seeds] = 1 mask_for_seed = expand_array_in_mask(mask_for_seed, eroded_mask) else: mask_for_seed = seeds * cc_mask logger.info('Nb of seeds in current CC: %d', mask_for_seed.sum()) cc_parcellation = voronoi( np.vstack(np.where(cc_mask)).T, np.vstack(np.where(mask_for_seed)).T) + 1 logger.info('CC parcellation labels: %s', str(np.unique(cc_parcellation))) maxp = parcellation.max() parcellation += expand_array_in_mask(cc_parcellation + maxp, cc_mask) logger.info('Current parcellation labels: %s', str(np.unique(parcellation))) logger.info('voronoi parcellation: %s, %s', str(parcellation.shape), str(parcellation.dtype)) return parcellation