RIP-AV-su-lab / AV /Tools /Remove_small_holes.py
weidai00's picture
Upload 72 files
6c0075d verified
import numpy as np
import functools
import warnings
from scipy import ndimage as ndi
from skimage import morphology
def remove_small_holes(ar, min_size=64, connectivity=1, in_place=False):
"""Remove continguous holes smaller than the specified size.
Parameters
----------
ar : ndarray (arbitrary shape, int or bool type)
The array containing the connected components of interest.
min_size : int, optional (default: 64)
The hole component size.
connectivity : int, {1, 2, ..., ar.ndim}, optional (default: 1)
The connectivity defining the neighborhood of a pixel.
in_place : bool, optional (default: False)
If `True`, remove the connected components in the input array itself.
Otherwise, make a copy.
Raises
------
TypeError
If the input array is of an invalid type, such as float or string.
ValueError
If the input array contains negative values.
Returns
-------
out : ndarray, same shape and type as input `ar`
The input array with small holes within connected components removed.
Examples
--------
# >>> from skimage import morphology
# >>> a = np.array([[1, 1, 1, 1, 1, 0],
# ... [1, 1, 1, 0, 1, 0],
# ... [1, 0, 0, 1, 1, 0],
# ... [1, 1, 1, 1, 1, 0]], bool)
# >>> b = morphology.remove_small_holes(a, 2)
# >>> b
# array([[ True, True, True, True, True, False],
# [ True, True, True, True, True, False],
# [ True, False, False, True, True, False],
# [ True, True, True, True, True, False]], dtype=bool)
# >>> c = morphology.remove_small_holes(a, 2, connectivity=2)
# >>> c
# array([[ True, True, True, True, True, False],
# [ True, True, True, False, True, False],
# [ True, False, False, True, True, False],
# [ True, True, True, True, True, False]], dtype=bool)
# >>> d = morphology.remove_small_holes(a, 2, in_place=True)
# >>> d is a
# True
# Notes
# -----
# If the array type is int, it is assumed that it contains already-labeled
# objects. The labels are not kept in the output image (this function always
# outputs a bool image). It is suggested that labeling is completed after
# using this function.
# """
# _check_dtype_supported(ar)
#Creates warning if image is an integer image
# if ar.dtype != bool:
# warnings.warn("Any labeled images will be returned as a boolean array. "
# "Did you mean to use a boolean array?", UserWarning)
if in_place:
out = ar
else:
out = ar.copy()
#Creating the inverse of ar
if in_place:
out = np.logical_not(out,out)
else:
out = np.logical_not(out)
#removing small objects from the inverse of ar
out = morphology.remove_small_objects(out, min_size, connectivity, in_place)
if in_place:
out = np.logical_not(out,out)
else:
out = np.logical_not(out)
return out