Mercurial > repos > imgteam > split_labelmap
comparison split_labelmap.py @ 1:9db1c22dbe17 draft
planemo upload for repository https://github.com/BMCV/galaxy-image-analysis/tree/master/tools/split_labelmaps/ commit 2286a6c9da88596349ed9d967c51541409c0a7bf
author | imgteam |
---|---|
date | Mon, 13 Nov 2023 22:12:26 +0000 |
parents | 597b7ef44b05 |
children | 0e7be7c35f15 |
comparison
equal
deleted
inserted
replaced
0:597b7ef44b05 | 1:9db1c22dbe17 |
---|---|
1 import argparse | |
2 import warnings | |
3 | |
4 import numpy as np | |
5 import scipy | |
6 import skimage.draw | |
7 import skimage.io | |
1 from imageio import imread as io_imread | 8 from imageio import imread as io_imread |
2 from skimage.measure import regionprops | 9 from skimage.measure import regionprops |
3 import numpy as np | |
4 #import matplotlib.pyplot as plt | |
5 import scipy | |
6 import skimage.io | |
7 import skimage.draw | |
8 from tifffile import imsave | |
9 import os | |
10 import argparse | |
11 import warnings | |
12 | 10 |
13 # split_label_image takes a label image and outputs a similar file with the given name where the labeled | 11 # split_label_image takes a label image and outputs a similar file with the given name where the labeled |
14 # parts of the image that touch (or overlap) are separated by at least 1 pixel (at most 2). | 12 # parts of the image that touch (or overlap) are separated by at least 1 pixel (at most 2). |
15 | 13 |
16 | 14 |
17 def split_labelmap(labelmap,outputfile): | 15 def split_labelmap(labelmap, outputfile): |
18 | 16 |
19 # Information from the label map. | 17 # Information from the label map. |
20 label_img = io_imread(labelmap) | 18 label_img = io_imread(labelmap) |
21 xtot, ytot = label_img.shape | 19 xtot, ytot = label_img.shape |
22 props = regionprops(label_img) | 20 props = regionprops(label_img) |
23 N = len(props) | 21 N = len(props) |
24 | 22 |
25 # Creating the backgrounds. | 23 # Creating the backgrounds. |
26 background = np.zeros([xtot,ytot], 'uint8') | 24 background = np.zeros([xtot, ytot], 'uint8') |
27 overlap = np.zeros([N,xtot,ytot],'uint8') | 25 overlap = np.zeros([N, xtot, ytot], 'uint8') |
28 compstruct = scipy.ndimage.generate_binary_structure(2, 2) # Mask for image dilation. | 26 compstruct = scipy.ndimage.generate_binary_structure(2, 2) # Mask for image dilation. |
29 | 27 |
30 i = 0 | 28 i = 0 |
31 for cell in props: | 29 for cell in props: |
32 cell_image = cell.image.astype('uint8') | 30 cell_image = cell.image.astype('uint8') |
33 #plt.imshow(cell_image) | |
34 | 31 |
35 # Replace the background area corresponding to the bounding box with the image representing the cell. | 32 # Replace the background area corresponding to the bounding box with the image representing the cell. |
36 background[int(cell.bbox[0]):int(cell.bbox[2]),int(cell.bbox[1]):int(cell.bbox[3])] += cell_image | 33 background[int(cell.bbox[0]):int(cell.bbox[2]), int(cell.bbox[1]):int(cell.bbox[3])] += cell_image |
37 overlap[i][int(cell.bbox[0]):int(cell.bbox[2]), int(cell.bbox[1]):int(cell.bbox[3])] = cell_image | 34 overlap[i][int(cell.bbox[0]):int(cell.bbox[2]), int(cell.bbox[1]):int(cell.bbox[3])] = cell_image |
38 | 35 |
39 # In the overlap array, dilate the cell in all directions. | 36 # In the overlap array, dilate the cell in all directions. |
40 overlap[i] = scipy.ndimage.binary_dilation( | 37 overlap[i] = scipy.ndimage.binary_dilation( |
41 overlap[i], structure=compstruct).astype(overlap[i].dtype) | 38 overlap[i], structure=compstruct).astype(overlap[i].dtype) |
43 i += 1 | 40 i += 1 |
44 | 41 |
45 if len(props) > 1: | 42 if len(props) > 1: |
46 # Sum together the overlap. | 43 # Sum together the overlap. |
47 total_overlap = sum(overlap) | 44 total_overlap = sum(overlap) |
48 | 45 |
49 # Wherever the overlap is greater than 1 replace that point with zero in the final image. | 46 # Wherever the overlap is greater than 1 replace that point with zero in the final image. |
50 for x in range(xtot): | 47 for x in range(xtot): |
51 for y in range(ytot): | 48 for y in range(ytot): |
52 if total_overlap[x,y] > 1: | 49 if total_overlap[x, y] > 1: |
53 background[x,y] = 0 | 50 background[x, y] = 0 |
54 | 51 |
55 # Force the image into 8-bit. | 52 # Force the image into 8-bit. |
56 result = skimage.util.img_as_ubyte(background) | 53 result = skimage.util.img_as_ubyte(background) |
57 | 54 |
58 # Save image | 55 # Save image |
59 with warnings.catch_warnings(): | 56 with warnings.catch_warnings(): |
60 warnings.simplefilter("ignore") | 57 warnings.simplefilter("ignore") |
61 skimage.io.imsave(outputfile, result, plugin="tifffile") | 58 skimage.io.imsave(outputfile, result, plugin="tifffile") |
62 | 59 |
63 return None | 60 return None |
61 | |
64 | 62 |
65 # To run from command line. | 63 # To run from command line. |
66 if __name__ == "__main__": | 64 if __name__ == "__main__": |
67 parser = argparse.ArgumentParser() | 65 parser = argparse.ArgumentParser() |
68 parser.add_argument('labelmap', | 66 parser.add_argument('labelmap', |