|
a |
|
b/CLI/MusculoskeletalAnalysisCLITools/fill.py |
|
|
1 |
|
|
|
2 |
|
|
|
3 |
def fill(mask, radius): |
|
|
4 |
"""Performs morphological close with the given radius, then fills any holes not connected to the outer edge. |
|
|
5 |
|
|
|
6 |
Takes a 2D binary numpy array and an integer radius. |
|
|
7 |
|
|
|
8 |
Returns the transformed array. |
|
|
9 |
""" |
|
|
10 |
import numpy as np |
|
|
11 |
import skimage.morphology |
|
|
12 |
# Performs morphological close, filling small gaps |
|
|
13 |
strel = skimage.morphology.disk(radius, dtype='bool') |
|
|
14 |
# Pad image to remove edge related problems |
|
|
15 |
mask=np.pad(mask, radius, mode='constant', constant_values=0) |
|
|
16 |
skimage.morphology.binary_closing(mask, footprint=strel, out=mask) |
|
|
17 |
mask=mask[radius:-radius, radius:-radius] |
|
|
18 |
# Fills in all holes not connected to the edges |
|
|
19 |
seed = np.ones_like(mask, dtype='bool') |
|
|
20 |
|
|
|
21 |
# seed is a mask of all ones, except zero where mask has zeros on the edges |
|
|
22 |
seed[0,:] = mask[0,:] |
|
|
23 |
seed[-1,:] = mask[-1,:] |
|
|
24 |
seed[:,-1] = mask[:,-1] |
|
|
25 |
seed[:,0] = mask[:,0] |
|
|
26 |
# seed's zero areas are expanded to match mask's zeros |
|
|
27 |
mask = skimage.morphology.reconstruction(seed, mask, method='erosion') |
|
|
28 |
return mask |