SNOW partitioning#
The filter is used to partition an image into regions using the SNOW algorithm which stands for the subnetwork of the oversegmented watershed. The steps taken are described in detail in the snow_advanced notebook. We provide a filter function that combines all the steps and it is explored here:
import numpy as np
import porespy as ps
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from skimage.morphology import binary_dilation
ps.visualization.set_mpl_style()
np.random.seed(1)
/opt/hostedtoolcache/Python/3.8.16/x64/lib/python3.8/site-packages/openpnm/algorithms/_invasion_percolation.py:358: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.
def _find_trapped_pores(inv_seq, indices, indptr, outlets): # pragma: no cover
im = ps.generators.overlapping_spheres([500, 500], r=10, porosity=0.5)
fig, ax = plt.subplots()
ax.imshow(im, origin='lower');

snow_out = ps.filters.snow_partitioning(im, r_max=4, sigma=0.4)
print(snow_out)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
Results of snow_partitioning generated at Tue Jun 6 13:52:16 2023
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
im Array of size (500, 500)
dt Array of size (500, 500)
peaks Array of size (500, 500)
regions Array of size (500, 500)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
fig, ax = plt.subplots(2, 2, figsize=[8, 8])
ax[0, 0].imshow(snow_out.im, origin='lower')
ax[0, 1].imshow(snow_out.dt, origin='lower')
dt_peak = snow_out.dt.copy()
peaks_dilated = binary_dilation(snow_out.peaks > 0)
dt_peak[peaks_dilated > 0] = np.nan
ax[1, 0].imshow(dt_peak, origin='lower')
ax[1, 1].imshow(ps.tools.randomize_colors(snow_out.regions), origin='lower')
ax[0, 0].set_title("Binary image");
ax[0, 1].set_title("Distance transform");
ax[1, 0].set_title("Distance transform peaks");
ax[1, 1].set_title("Segmentation");
