Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_map_to_regions(self):
im = self.im
regions = ps.filters.snow_partitioning(im)
values = np.random.rand(regions.max() + 1)
mapped = ps.networks.map_to_regions(regions, values)
assert mapped.max() < 1
# Some failures
values = np.random.rand(regions.max())
with pytest.raises(Exception):
mapped = ps.networks.map_to_regions(regions, values)
values = np.random.rand(regions.max()+2)
with pytest.raises(Exception):
mapped = ps.networks.map_to_regions(regions, values)
def test_planar_2d_image(self):
np.random.seed(1)
im1 = ps.generators.blobs([100, 100, 1])
np.random.seed(1)
im2 = ps.generators.blobs([100, 1, 100])
np.random.seed(1)
im3 = ps.generators.blobs([1, 100, 100])
np.random.seed(1)
snow_out1 = ps.filters.snow_partitioning(im1, return_all=True)
pore_map1 = snow_out1.im * snow_out1.regions
net1 = ps.networks.regions_to_network(im=pore_map1,
dt=snow_out1.dt,
voxel_size=1)
np.random.seed(1)
snow_out2 = ps.filters.snow_partitioning(im2, return_all=True)
pore_map2 = snow_out2.im * snow_out2.regions
net2 = ps.networks.regions_to_network(im=pore_map2,
dt=snow_out2.dt,
voxel_size=1)
np.random.seed(1)
snow_out3 = ps.filters.snow_partitioning(im3, return_all=True)
pore_map3 = snow_out3.im * snow_out3.regions
net3 = ps.networks.regions_to_network(im=pore_map3,
dt=snow_out3.dt,
voxel_size=1)
def test_planar_2d_image(self):
np.random.seed(1)
im1 = ps.generators.blobs([100, 100, 1])
np.random.seed(1)
im2 = ps.generators.blobs([100, 1, 100])
np.random.seed(1)
im3 = ps.generators.blobs([1, 100, 100])
np.random.seed(1)
snow_out1 = ps.filters.snow_partitioning(im1, return_all=True)
pore_map1 = snow_out1.im * snow_out1.regions
net1 = ps.networks.regions_to_network(im=pore_map1,
dt=snow_out1.dt,
voxel_size=1)
np.random.seed(1)
snow_out2 = ps.filters.snow_partitioning(im2, return_all=True)
pore_map2 = snow_out2.im * snow_out2.regions
net2 = ps.networks.regions_to_network(im=pore_map2,
dt=snow_out2.dt,
voxel_size=1)
np.random.seed(1)
snow_out3 = ps.filters.snow_partitioning(im3, return_all=True)
pore_map3 = snow_out3.im * snow_out3.regions
net3 = ps.networks.regions_to_network(im=pore_map3,
dt=snow_out3.dt,
voxel_size=1)
assert np.allclose(net1['pore.coords'][:, 0],
net2['pore.coords'][:, 0])
assert np.allclose(net1['pore.coords'][:, 1],
net2['pore.coords'][:, 2])
assert np.allclose(net1['pore.coords'][:, 0],
net3['pore.coords'][:, 1])
def test_add_bounadary_regions_3D(self):
im = self.im3d
regions = ps.filters.snow_partitioning(im)
f = ['left', 'right']
bd = ps.networks.add_boundary_regions(regions, faces=f)
assert bd.shape[0] > regions.shape[0]
f = ['front', 'back']
bd = ps.networks.add_boundary_regions(regions, faces=f)
assert bd.shape[1] > regions.shape[1]
f = ['bottom', 'top']
bd = ps.networks.add_boundary_regions(regions, faces=f)
assert bd.shape[2] > regions.shape[2]
f = ['bottom', 'top', 'left', 'right', 'front', 'back']
bd = ps.networks.add_boundary_regions(regions, faces=f)
assert bd.shape[0] > regions.shape[0]
assert bd.shape[1] > regions.shape[1]
assert bd.shape[2] > regions.shape[2]
def setup_class(self):
self.im = ps.generators.blobs(shape=[300, 300])
self.snow = ps.filters.snow_partitioning(self.im, return_all=True)
self.im3d = ps.generators.blobs(shape=[50, 50, 50])
self.snow3d = ps.filters.snow_partitioning(self.im3d, return_all=True)
References
----------
[1] Gostick, J. "A versatile and efficient network extraction algorithm
using marker-based watershed segmenation". Phys. Rev. E 96, 023307 (2017)
[2] Khan, ZA et al. "Dual network extraction algorithm to investigate
multiple transport processes in porous materials: Image-based modeling
of pore and grain-scale processes. Computers and Chemical Engineering.
123(6), 64-77 (2019)
"""
# -------------------------------------------------------------------------
# SNOW void phase
pore_regions = snow_partitioning(im, return_all=True)
# SNOW solid phase
solid_regions = snow_partitioning(~im, return_all=True)
# -------------------------------------------------------------------------
# Combined Distance transform of two phases.
pore_dt = pore_regions.dt
solid_dt = solid_regions.dt
dt = pore_dt + solid_dt
# Calculates combined void and solid regions for dual network extraction
pore_regions = pore_regions.regions
solid_regions = solid_regions.regions
pore_region = pore_regions*im
solid_region = solid_regions*~im
solid_num = sp.amax(pore_regions)
solid_region = solid_region + solid_num
solid_region = solid_region * ~im
regions = pore_region + solid_region
b_num = sp.amax(regions)
# -------------------------------------------------------------------------
directly to an OpenPNM network object using the ``update`` command.
* ``net``: A dictionary containing all the void and solid phase size data,
as well as the network topological information. The dictionary names
use the OpenPNM convention (i.e. 'pore.coords', 'throat.conns') so it
may be converted directly to an OpenPNM network object using the
``update`` command.
* ``im``: The binary image of the void space
* ``dt``: The combined distance transform of the image
* ``regions``: The void and solid space partitioned into pores and solids
phases using a marker based watershed with the peaks found by the
SNOW Algorithm.
"""
# -------------------------------------------------------------------------
# SNOW void phase
regions = snow_partitioning(im=im, return_all=True)
im = regions.im
dt = regions.dt
regions = regions.regions
b_num = sp.amax(regions)
# -------------------------------------------------------------------------
# Boundary Conditions
regions = add_boundary_regions(regions=regions, faces=boundary_faces)
# -------------------------------------------------------------------------
# Padding distance transform and image to extract geometrical properties
dt = pad_faces(im=dt, faces=boundary_faces)
im = pad_faces(im=im, faces=boundary_faces)
regions = regions*im
regions = make_contiguous(regions)
# -------------------------------------------------------------------------
# Extract void and throat information from image
net = regions_to_network(im=regions, dt=dt, voxel_size=voxel_size)
will be using the marching cube algorithm. This is a more accurate
representation of area in extracted network, but is quite slow, so
it is ``False`` by default. The default method simply counts voxels
so does not correctly account for the voxelated nature of the images.
Returns
-------
A dictionary containing the void phase size data, as well as the network
topological information. The dictionary names use the OpenPNM
convention (i.e. 'pore.coords', 'throat.conns') so it may be converted
directly to an OpenPNM network object using the ``update`` command.
"""
# -------------------------------------------------------------------------
# SNOW void phase
regions = snow_partitioning(im=im, return_all=True)
im = regions.im
dt = regions.dt
regions = regions.regions
b_num = sp.amax(regions)
# -------------------------------------------------------------------------
# Boundary Conditions
regions = add_boundary_regions(regions=regions, faces=boundary_faces)
# -------------------------------------------------------------------------
# Padding distance transform to extract geometrical properties
f = boundary_faces
if f is not None:
if im.ndim == 2:
faces = [(int('left' in f)*3, int('right' in f)*3),
(int(('front') in f)*3 or int(('bottom') in f)*3,
int(('back') in f)*3 or int(('top') in f)*3)]
SNOW Algorithm.
References
----------
[1] Gostick, J. "A versatile and efficient network extraction algorithm
using marker-based watershed segmenation". Phys. Rev. E 96, 023307 (2017)
[2] Khan, ZA et al. "Dual network extraction algorithm to investigate
multiple transport processes in porous materials: Image-based modeling
of pore and grain-scale processes. Computers and Chemical Engineering.
123(6), 64-77 (2019)
"""
# -------------------------------------------------------------------------
# SNOW void phase
pore_regions = snow_partitioning(im, return_all=True)
# SNOW solid phase
solid_regions = snow_partitioning(~im, return_all=True)
# -------------------------------------------------------------------------
# Combined Distance transform of two phases.
pore_dt = pore_regions.dt
solid_dt = solid_regions.dt
dt = pore_dt + solid_dt
# Calculates combined void and solid regions for dual network extraction
pore_regions = pore_regions.regions
solid_regions = solid_regions.regions
pore_region = pore_regions*im
solid_region = solid_regions*~im
solid_num = sp.amax(pore_regions)
solid_region = solid_region + solid_num
solid_region = solid_region * ~im
regions = pore_region + solid_region