changeset 0:597b7ef44b05 draft

planemo upload for repository https://github.com/BMCV/galaxy-image-analysis/tools/split_labelmaps/ commit c3f4b766f03770f094fda6bda0a5882c0ebd4581
author imgteam
date Sat, 09 Feb 2019 14:47:34 -0500
parents
children 9db1c22dbe17
files split_labelmap.py split_labelmap.xml test-data/out.tif test-data/sample_seg.tif
diffstat 4 files changed, 109 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/split_labelmap.py	Sat Feb 09 14:47:34 2019 -0500
@@ -0,0 +1,75 @@
+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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/split_labelmap.xml	Sat Feb 09 14:47:34 2019 -0500
@@ -0,0 +1,34 @@
+<tool id="ip_split_labelmap" name="Split Labelmap" version="0.1">
+    <description></description>
+    <requirements> 
+        <requirement type="package" version="0.14.2">scikit-image</requirement>
+        <requirement type="package" version="1.15.4">numpy</requirement>
+        <requirement type="package" version="0.15.1">tifffile</requirement> <!--not sure if this is required-->
+    </requirements>
+    <command> 
+        <![CDATA[
+        python '$__tool_directory__/split_labelmap.py' '$input' '$output'
+        ]]>
+    </command>
+    <inputs> 
+        <param name="input" type="data" format="tiff,png,jpg,bmp" label="Image containing labels"/> 
+    </inputs>
+    <outputs>
+        <data name="output" format="tiff"/>
+    </outputs>
+    <tests>
+        <test>
+            <param name="input" value="sample_seg.tif"/>
+            <output name="output" value="out.tif" ftype="tiff" compare="sim_size"/>
+        </test>
+    </tests>
+    <help>
+    **What it does**
+
+    Takes a labeled image and outputs a similar file where the labeled parts
+    of the image that touch (or overlap) are separated by at least 1 pixel (at most 2).
+    </help>
+    <citations>
+        <citation type="doi">10.1016/j.jbiotec.2017.07.019</citation>
+    </citations>
+</tool>
Binary file test-data/out.tif has changed
Binary file test-data/sample_seg.tif has changed