def edge_distances(labels, atlas_edge=None, path=None, spacing=None): """Measure the distance between edge images. Args: labels: Labels image as Numpy array. atlas_edge: Image as a Numpy array of the atlas reduced to its edges. Defaults to None to load from the corresponding registered file path based on ``path``. path: Path from which to load ``atlas_edge`` if it is None. spacing: Grid spacing sequence of same length as number of image axis dimensions; defaults to None. Returns: An image array of the same shape as ``labels_edge`` with label edge values replaced by corresponding distance values. """ if atlas_edge is None: atlas_edge = sitk_io.load_registered_img( path, config.RegNames.IMG_ATLAS_EDGE.value) # create distance map between edges of original and new segmentations labels_edge = vols.make_labels_edge(labels) dist_to_orig, _, _ = cv_nd.borders_distance( atlas_edge != 0, labels_edge != 0, spacing=spacing) return dist_to_orig, labels_edge
def make_labels_level_img(img_path, level, prefix=None, show=False): """Replace labels in an image with their parents at the given level. Labels that do not fall within a parent at that level will remain in place. Args: img_path: Path to the base image from which the corresponding registered image will be found. level: Ontological level at which to group child labels. prefix: Start of path for output image; defaults to None to use ``img_path`` instead. show: True to show the images after generating them; defaults to False. """ # load original labels image and setup ontology dictionary labels_sitk = sitk_io.load_registered_img(img_path, config.RegNames.IMG_LABELS.value, get_sitk=True) labels_np = sitk.GetArrayFromImage(labels_sitk) ref = ontology.load_labels_ref(config.load_labels) labels_ref_lookup = ontology.create_aba_reverse_lookup(ref) ids = list(labels_ref_lookup.keys()) for key in ids: keys = [key, -1 * key] for region in keys: if region == 0: continue # get ontological label label = labels_ref_lookup[abs(region)] label_level = label[ontology.NODE][config.ABAKeys.LEVEL.value] if label_level == level: # get children (including parent first) at given level # and replace them with parent label_ids = ontology.get_children_from_id( labels_ref_lookup, region) labels_region = np.isin(labels_np, label_ids) print("replacing labels within", region) labels_np[labels_region] = region labels_level_sitk = sitk_io.replace_sitk_with_numpy(labels_sitk, labels_np) # generate an edge image at this level labels_edge = vols.make_labels_edge(labels_np) labels_edge_sikt = sitk_io.replace_sitk_with_numpy(labels_sitk, labels_edge) # write and optionally display labels level image imgs_write = { config.RegNames.IMG_LABELS_LEVEL.value.format(level): labels_level_sitk, config.RegNames.IMG_LABELS_EDGE_LEVEL.value.format(level): labels_edge_sikt, } out_path = prefix if prefix else img_path sitk_io.write_reg_images(imgs_write, out_path) if show: for img in imgs_write.values(): if img: sitk.Show(img)
def make_labels_level_img(img_path, level, prefix=None, show=False): """Replace labels in an image with their parents at the given level. Labels that do not fall within a parent at that level will remain in place. Args: img_path: Path to the base image from which the corresponding registered image will be found. level: Ontological level at which to group child labels. prefix: Start of path for output image; defaults to None to use ``img_path`` instead. show: True to show the images after generating them; defaults to False. """ # load original labels image and setup ontology dictionary labels_sitk = sitk_io.load_registered_img(img_path, config.RegNames.IMG_LABELS.value, get_sitk=True) labels_np = sitk.GetArrayFromImage(labels_sitk) ref = ontology.LabelsRef(config.load_labels).load() # remap labels to given level labels_np = ontology.make_labels_level(labels_np, ref, level) labels_level_sitk = sitk_io.replace_sitk_with_numpy(labels_sitk, labels_np) # generate an edge image at this level labels_edge = vols.make_labels_edge(labels_np) labels_edge_sikt = sitk_io.replace_sitk_with_numpy(labels_sitk, labels_edge) # write and optionally display labels level image imgs_write = { config.RegNames.IMG_LABELS_LEVEL.value.format(level): labels_level_sitk, config.RegNames.IMG_LABELS_EDGE_LEVEL.value.format(level): labels_edge_sikt, } out_path = prefix if prefix else img_path sitk_io.write_reg_images(imgs_write, out_path) if show: for img in imgs_write.values(): if img: sitk.Show(img)