Source code for porespy.binarization.__funcs__
from skimage import filters
import porespy as ps
import matplotlib.pyplot as plt
import scipy.ndimage as spim
import scipy as sp
from skimage.morphology import ball, disk, square, cube
from skimage.segmentation import clear_border
[docs]def simple_otsu(im, trim_solid=True):
r"""
Uses Otsu's method to find a threshold, then uses binary opening and
closing to remove noise.
Parameters
----------
im : ND-image
The greyscale image of the porous medium to be binarized.
trim_solid : Boolean
If True (default) then all solid voxels not connected to an image
boundary are trimmed.
Returns
-------
An ND-image the same size as ``im`` but with True and False values
indicating the binarized or segmented phases.
Examples
--------
>>> im = ps.generators.blobs([300, 300], porosity=0.5)
>>> im = ps.generators.add_noise(im)
>>> im = spim.gaussian_filter(im, sigma=1)
>>> im = simple_otsu(im)
"""
if im.ndim == 2:
ball = disk
cube = square
im = sp.pad(array=im, pad_width=1, mode='constant', constant_values=1)
val = filters.threshold_otsu(im)
im = im >= val
# Remove speckled noise from void and solid phases
im = spim.binary_closing(input=im, structure=ball(1))
im = spim.binary_opening(input=im, structure=ball(1))
# Clean up edges
im = spim.binary_closing(input=im, structure=cube(3))
im = spim.binary_opening(input=im, structure=cube(3))
im = im[[slice(1, im.shape[d]-1) for d in range(im.ndim)]]
temp = clear_border(~im)
im = im + temp
return im