Switch to unified view

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