Mercurial > repos > imgteam > split_labelmap
view split_labelmap.py @ 0:564dd83ce0c0 draft default tip
planemo upload for repository https://github.com/BMCV/galaxy-image-analysis/tools/split_labelmaps/ commit c3f4b766f03770f094fda6bda0a5882c0ebd4581
author | imgteam |
---|---|
date | Sat, 09 Feb 2019 14:25:39 -0500 |
parents | |
children |
line wrap: on
line source
from imageio import imread as io_imread from skimage.measure import regionprops import numpy as np #import matplotlib.pyplot as plt import scipy import skimage.io import skimage.draw from tifffile import imsave import os import argparse import warnings # split_label_image takes a label image and outputs a similar file with the given name where the labeled # parts of the image that touch (or overlap) are separated by at least 1 pixel (at most 2). def split_labelmap(labelmap,outputfile): # Information from the label map. label_img = io_imread(labelmap) xtot, ytot = label_img.shape props = regionprops(label_img) N = len(props) # Creating the backgrounds. background = np.zeros([xtot,ytot], 'uint8') overlap = np.zeros([N,xtot,ytot],'uint8') compstruct = scipy.ndimage.generate_binary_structure(2, 2) # Mask for image dilation. i = 0 for cell in props: cell_image = cell.image.astype('uint8') #plt.imshow(cell_image) # Replace the background area corresponding to the bounding box with the image representing the cell. background[int(cell.bbox[0]):int(cell.bbox[2]),int(cell.bbox[1]):int(cell.bbox[3])] += cell_image overlap[i][int(cell.bbox[0]):int(cell.bbox[2]), int(cell.bbox[1]):int(cell.bbox[3])] = cell_image # In the overlap array, dilate the cell in all directions. overlap[i] = scipy.ndimage.binary_dilation( overlap[i], structure=compstruct).astype(overlap[i].dtype) i += 1 if len(props) > 1: # Sum together the overlap. total_overlap = sum(overlap) # Wherever the overlap is greater than 1 replace that point with zero in the final image. for x in range(xtot): for y in range(ytot): if total_overlap[x,y] > 1: background[x,y] = 0 # Force the image into 8-bit. result = skimage.util.img_as_ubyte(background) # Save image with warnings.catch_warnings(): warnings.simplefilter("ignore") skimage.io.imsave(outputfile, result, plugin="tifffile") return None # To run from command line. if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('labelmap', help='Label map image.') parser.add_argument('outputfile', help='Output file. Without extension (although it corrects if you ' 'add it; will always return a .tif') args = parser.parse_args() split_labelmap(args.labelmap, args.outputfile)