def _label_objects_wrapper(mask, splitting_scalar, remove_at_edge=False): if remove_at_edge: raise NotImplementedError def _remove_at_edge(object_labels): mask_edge = np.zeros_like(mask) mask_edge[:, :, 1] = True # has to be k==1 because object identification codes treats actual edges as ghost cells mask_edge[:, :, -2] = True cloud_identification.remove_intersecting(object_labels, mask_edge) if mask.shape != splitting_scalar.shape: raise Exception("Incompatible shapes of splitting scalar ({}) and " "mask ({})".format(splitting_scalar.shape, mask.shape)) assert mask.dims == splitting_scalar.dims for d in mask.dims: assert np.all(mask[d].values == splitting_scalar[d].values) object_labels = cloud_identification.number_objects( splitting_scalar.values, mask=mask.values) # if remove_at_edge: # _remove_at_edge(object_labels) return object_labels
def label_objects(mask, splitting_scalar=None, remove_at_edge=True): def _remove_at_edge(object_labels): mask_edge = np.zeros_like(mask) mask_edge[:, :, 1] = True # has to be k==1 because object identification codes treats actual edges as ghost cells mask_edge[:, :, -2] = True cloud_identification.remove_intersecting(object_labels, mask_edge) if splitting_scalar is None: splitting_scalar = np.ones_like(mask) else: assert mask.shape == splitting_scalar.shape assert mask.dims == splitting_scalar.dims # NB: should check coord values too object_labels = cloud_identification.number_objects(splitting_scalar, mask=mask) if remove_at_edge: _remove_at_edge(object_labels) return object_labels