Source code for porespy.networks._maximal_ball
import logging
import os
import time
import psutil
import subprocess
import numpy as np
__all__ = [
"maximal_ball_wrapper",
]
logger = logging.getLogger(__name__)
[docs]
def maximal_ball_wrapper(im, prefix, path_to_exe, voxel_size=1e-6):
r"""
Implementing a maximal ball algorithm on an image
Parameters
----------
im : ndarray
The image of the porous material.
prefix : string
The prefix to append to the filenames (i.e. 'prefix_node1.dat')
path_to_exe : string
Path to the maximal ball .exe file (pnextract.exe). See Notes
voxel_size : scalar
The size of a voxel side in preferred units. The default is 1e-6, so the
user can apply the scaling to the returned results after the fact.
Notes
-----
outputs four DAT files:
prefix_link1, prefix_link2, prefix_node1, prefix_node2
This function only runs on Windows since the Windows compatible binary is
provided by the Imperial College team.
"""
try:
import imageio
except ModuleNotFoundError:
msg = "The imageio package can be installed with pip install imageio"
raise ModuleNotFoundError(msg)
file = os.path.splitext(prefix)[0]
imageio.volsave(file + ".tif", np.array(im.astype("uint8")))
with open(f"{file}.mhd", "w") as f:
f.write("ObjectType = Image\n\
NDims = 3 \n\
ElementType = MET_UCHAR \n\
DimSize = " + str(im.shape[0]) + " " + str(im.shape[1]) + " " +
str(im.shape[2]) + "\n\
ElementSpacing =" + str(voxel_size*1e6) + " " +
str(voxel_size*1e6) + " " + str(voxel_size*1e6) + "\n\
Offset = 0 0 0 \n\
ElementDataFile = " + file + ".tif")
subprocess.Popen([path_to_exe, file + ".mhd"])
time_elapsed = 0
while _is_running('pnextract'):
logger.info('Maximal ball algorithm running for {time_elapsed} s')
time.sleep(10)
time_elapsed += 10
def _is_running(process_name):
r"""
Check if there is any running process that contains the given name.
"""
for proc in psutil.process_iter():
try:
# Check if process name contains the given name string.
if process_name.lower() in proc.name().lower():
return True
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
return False