From e2163eac30894e22ce8e6e738445067232a36436 Mon Sep 17 00:00:00 2001 From: jgostick Date: Tue, 14 Jan 2025 11:21:23 -0500 Subject: [PATCH 1/4] changed skeletonize_3d to skeletonize --- examples/filters/reference/apply_padded.ipynb | 4 ++-- examples/filters/reference/prune_branches.ipynb | 6 +++--- src/porespy/filters/_funcs.py | 2 +- src/porespy/metrics/_regionprops.py | 6 +++--- src/porespy/tools/_funcs.py | 2 +- test/unit/test_filters.py | 10 +++++----- test/unit/test_parallel_filters.py | 2 +- test/unit/test_simulations.py | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/filters/reference/apply_padded.ipynb b/examples/filters/reference/apply_padded.ipynb index 86e4af15f..f64b2cfd4 100644 --- a/examples/filters/reference/apply_padded.ipynb +++ b/examples/filters/reference/apply_padded.ipynb @@ -80,7 +80,7 @@ "metadata": {}, "source": [ "## `func`\n", - "A good use case is `skeletonize_3d`, which has edge artifacts that can be reduced if the image is pre-padded. It works on 2D or 3D images." + "A good use case is `skeletonize`, which has edge artifacts that can be reduced if the image is pre-padded. It works on 2D or 3D images." ] }, { @@ -96,7 +96,7 @@ }, "outputs": [], "source": [ - "func = skimage.morphology.skeletonize_3d" + "func = skimage.morphology.skeletonize" ] }, { diff --git a/examples/filters/reference/prune_branches.ipynb b/examples/filters/reference/prune_branches.ipynb index ae975cd2b..cbfd4cde8 100644 --- a/examples/filters/reference/prune_branches.ipynb +++ b/examples/filters/reference/prune_branches.ipynb @@ -25,7 +25,7 @@ "import porespy as ps\n", "import scipy.ndimage as spim\n", "import matplotlib.pyplot as plt\n", - "from skimage.morphology import skeletonize_3d\n", + "from skimage.morphology import skeletonize\n", "ps.visualization.set_mpl_style()" ] }, @@ -34,7 +34,7 @@ "metadata": {}, "source": [ "## `im`\n", - "The function requires a skeleton such as that produced by ``skimage.mophology.skeletonize_3d``:" + "The function requires a skeleton such as that produced by ``skimage.mophology.skeletonize``:" ] }, { @@ -118,7 +118,7 @@ ], "source": [ "im = ps.generators.blobs(shape=[250, 250], blobiness=1, porosity=0.6)\n", - "sk = skeletonize_3d(im)\n", + "sk = skeletonize(im)\n", "sk1 = ps.filters.prune_branches(sk)\n", "\n", "fig, ax = plt.subplots(1, 2, figsize=[12, 6])\n", diff --git a/src/porespy/filters/_funcs.py b/src/porespy/filters/_funcs.py index 8619da535..d5d5c971c 100644 --- a/src/porespy/filters/_funcs.py +++ b/src/porespy/filters/_funcs.py @@ -169,7 +169,7 @@ def apply_padded(im, pad_width, func, pad_val=1, **kwargs): Notes ----- - A use case for this is when using ``skimage.morphology.skeletonize_3d`` + A use case for this is when using ``skimage.morphology.skeletonize`` to ensure that the skeleton extends beyond the edges of the image. Examples diff --git a/src/porespy/metrics/_regionprops.py b/src/porespy/metrics/_regionprops.py index 30b40ac23..073419124 100644 --- a/src/porespy/metrics/_regionprops.py +++ b/src/porespy/metrics/_regionprops.py @@ -7,7 +7,7 @@ from skimage.measure import marching_cubes except ImportError: from skimage.measure import marching_cubes_lewiner as marching_cubes -from skimage.morphology import skeletonize_3d, ball +from skimage.morphology import skeletonize, ball from skimage.measure import regionprops from skimage.measure._regionprops import RegionProperties from pandas import DataFrame @@ -191,7 +191,7 @@ def regionprops_3D(im): as the region to the actual surface area of the region. 'skeleton' - The medial axis of the region obtained using the ``skeletonize_3D`` + The medial axis of the region obtained using the ``skeletonize`` method from **skimage**. 'convex_volume' @@ -274,7 +274,7 @@ def sphericity(self): @property def skeleton(self): - return skeletonize_3d(self.mask) + return skeletonize(self.mask) @property def surface_area(self): diff --git a/src/porespy/tools/_funcs.py b/src/porespy/tools/_funcs.py index ba451be2e..0ad390ebf 100644 --- a/src/porespy/tools/_funcs.py +++ b/src/porespy/tools/_funcs.py @@ -62,7 +62,7 @@ def unpad(im, pad_width): Notes ----- - A use case for this is when using ``skimage.morphology.skeletonize_3d`` + A use case for this is when using ``skimage.morphology.skeletonize`` to ensure that the skeleton extends beyond the edges of the image, but the padding should be subsequently removed. diff --git a/test/unit/test_filters.py b/test/unit/test_filters.py index bbc318458..bd5c61da9 100644 --- a/test/unit/test_filters.py +++ b/test/unit/test_filters.py @@ -3,7 +3,7 @@ from edt import edt import porespy as ps import scipy.ndimage as spim -from skimage.morphology import disk, ball, skeletonize_3d +from skimage.morphology import disk, ball, skeletonize from skimage.util import random_noise from scipy.stats import norm ps.settings.tqdm['disable'] = True @@ -467,13 +467,13 @@ def test_chunked_func_w_ill_defined_filter(self): def test_prune_branches(self): im = ps.generators.lattice_spheres(shape=[100, 100, 100], r=4) - skel1 = skeletonize_3d(im) + skel1 = skeletonize(im) skel2 = ps.filters.prune_branches(skel1) assert skel1.sum() > skel2.sum() def test_prune_branches_n2(self): im = ps.generators.lattice_spheres(shape=[100, 100, 100], r=4) - skel1 = skeletonize_3d(im) + skel1 = skeletonize(im) skel2 = ps.filters.prune_branches(skel1, iterations=1) skel3 = ps.filters.prune_branches(skel1, iterations=2) assert skel1.sum() > skel2.sum() @@ -481,9 +481,9 @@ def test_prune_branches_n2(self): def test_apply_padded(self): im = ps.generators.blobs(shape=[100, 100]) - skel1 = skeletonize_3d(im) + skel1 = skeletonize(im) skel2 = ps.filters.apply_padded(im=im, pad_width=20, pad_val=1, - func=skeletonize_3d) + func=skeletonize) assert (skel1.astype(bool)).sum() != (skel2.astype(bool)).sum() def test_trim_small_clusters(self): diff --git a/test/unit/test_parallel_filters.py b/test/unit/test_parallel_filters.py index 3e4f3bcb1..bf20c2715 100644 --- a/test/unit/test_parallel_filters.py +++ b/test/unit/test_parallel_filters.py @@ -2,7 +2,7 @@ from edt import edt import porespy as ps import scipy.ndimage as spim -from skimage.morphology import skeletonize_3d +from skimage.morphology import skeletonize ps.settings.loglevel = "CRITICAL" ps.settings.tqdm['disable'] = True diff --git a/test/unit/test_simulations.py b/test/unit/test_simulations.py index f69a0e87e..98f26b53c 100644 --- a/test/unit/test_simulations.py +++ b/test/unit/test_simulations.py @@ -3,7 +3,7 @@ from edt import edt import porespy as ps import scipy.ndimage as spim -from skimage.morphology import disk, ball, skeletonize_3d +from skimage.morphology import disk, ball, skeletonize from skimage.util import random_noise from scipy.stats import norm From f01028eedffc96b69b0ccb36b58002cdaa694c84 Mon Sep 17 00:00:00 2001 From: jgostick Date: Tue, 14 Jan 2025 11:55:04 -0500 Subject: [PATCH 2/4] fixing pytest/scipy bug --- .gitignore | 1 + pyproject.toml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 9cca3b8a3..35033b6e3 100644 --- a/.gitignore +++ b/.gitignore @@ -163,3 +163,4 @@ examples/networks/*.vt* examples/**/*.vtp examples/**/*.tif *.mphtxt +*.DS_Store diff --git a/pyproject.toml b/pyproject.toml index bfa18e794..e15dc45d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,6 +137,8 @@ python_classes = "*Test" python_functions = "test_*" testpaths = ["test", "examples"] norecursedirs = [".git", ".github", ".ipynb_checkpoints", "build", "dist"] +addopts = "--assert=plain" + [tool.coverage.run] source = ["src/porespy"] From 8dfe673bdcde3fc4ea9fb6d6aa31a9fb39961923 Mon Sep 17 00:00:00 2001 From: jgostick Date: Tue, 14 Jan 2025 12:02:08 -0500 Subject: [PATCH 3/4] oops --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e15dc45d3..255e65f8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,6 +125,7 @@ packages = ["src/porespy"] [tool.pytest.ini_options] minversion = "6.0" addopts = [ + "--assert=plain", "-ra -v", "--ignore=docs/conf.py", "--ignore=examples/generators/reference/fractal_noise.ipynb", @@ -137,7 +138,6 @@ python_classes = "*Test" python_functions = "test_*" testpaths = ["test", "examples"] norecursedirs = [".git", ".github", ".ipynb_checkpoints", "build", "dist"] -addopts = "--assert=plain" [tool.coverage.run] From 51b82d1d95906374513d44e51fd7dba7371f935d Mon Sep 17 00:00:00 2001 From: jgostick Date: Tue, 14 Jan 2025 21:15:51 -0500 Subject: [PATCH 4/4] updating toml to force scikit-image 0.24 --- pyproject.toml | 4 ++-- test/unit/test_filters.py | 24 +++++++++++++++++------- test/unit/test_network_size_factor.py | 17 ++++++++++------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 255e65f8b..8a6defa16 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,14 +34,14 @@ dependencies = [ "pandas", "psutil", "rich", - "scikit-image", + "scikit-image<0.25.0", "scipy", "tqdm", "pywavelets", "setuptools", ] readme = "README.md" -requires-python = ">= 3.8" +requires-python = ">= 3.10" [project.optional-dependencies] build = ["hatch"] diff --git a/test/unit/test_filters.py b/test/unit/test_filters.py index bd5c61da9..9509c2268 100644 --- a/test/unit/test_filters.py +++ b/test/unit/test_filters.py @@ -3,7 +3,7 @@ from edt import edt import porespy as ps import scipy.ndimage as spim -from skimage.morphology import disk, ball, skeletonize +from skimage.morphology import disk, ball from skimage.util import random_noise from scipy.stats import norm ps.settings.tqdm['disable'] = True @@ -466,24 +466,33 @@ def test_chunked_func_w_ill_defined_filter(self): overlap=5) def test_prune_branches(self): - im = ps.generators.lattice_spheres(shape=[100, 100, 100], r=4) + from skimage.morphology import skeletonize + im = ps.generators.random_spheres([100, 100, 100], r=4, seed=0) skel1 = skeletonize(im) skel2 = ps.filters.prune_branches(skel1) assert skel1.sum() > skel2.sum() def test_prune_branches_n2(self): - im = ps.generators.lattice_spheres(shape=[100, 100, 100], r=4) + from skimage.morphology import skeletonize + im = ps.generators.random_spheres([100, 100, 100], r=4, seed=0) skel1 = skeletonize(im) skel2 = ps.filters.prune_branches(skel1, iterations=1) skel3 = ps.filters.prune_branches(skel1, iterations=2) assert skel1.sum() > skel2.sum() - assert skel2.sum() == skel3.sum() + assert skel2.sum() > skel3.sum() + skel4 = ps.filters.prune_branches(skel1, iterations=3) + assert skel3.sum() > skel4.sum() def test_apply_padded(self): + from skimage.morphology import skeletonize im = ps.generators.blobs(shape=[100, 100]) skel1 = skeletonize(im) - skel2 = ps.filters.apply_padded(im=im, pad_width=20, pad_val=1, - func=skeletonize) + skel2 = ps.filters.apply_padded( + im=im, + pad_width=20, + pad_val=1, + func=skeletonize, + ) assert (skel1.astype(bool)).sum() != (skel2.astype(bool)).sum() def test_trim_small_clusters(self): @@ -514,7 +523,8 @@ def test_hold_peaks_algorithm(self): def test_nl_means_layered(self): im = ps.generators.blobs(shape=[50, 50, 50], blobiness=.5) - im2 = random_noise(im, seed=0) + np.random.seed(0) + im2 = random_noise(im) filt = ps.filters.nl_means_layered(im=im2) p1 = (filt[0, ...] > 0.5).sum() p2 = (im[0, ...]).sum() diff --git a/test/unit/test_network_size_factor.py b/test/unit/test_network_size_factor.py index 046822208..190b2be7d 100644 --- a/test/unit/test_network_size_factor.py +++ b/test/unit/test_network_size_factor.py @@ -5,8 +5,7 @@ class NetworkSizeFactorTest(): def setup_class(self): - np.random.seed(10) - im = ps.generators.blobs(shape=[50, 50, 50]) + im = ps.generators.blobs(shape=[50, 50, 50], seed=10) self.im = im[:15, :15, :15] self.snow = ps.networks.snow2(self.im, boundary_width=0, parallelization=None) @@ -15,8 +14,10 @@ def test_diffusive_size_factor_DNS(self): regions = self.snow.regions net = self.snow.network conns = net['throat.conns'] - size_factors = ps.networks.diffusive_size_factor_DNS(regions, - throat_conns=conns) + size_factors = ps.networks.diffusive_size_factor_DNS( + regions, + throat_conns=conns, + ) values = np.array([1.43456123, 0.9612569, 1.22389664, 0.14359343, 0.18617079, 1.30144843, 0.22238891, 1.32222092]) @@ -27,9 +28,11 @@ def test_diffusive_size_factor_DNS_voxel_size(self): regions = self.snow.regions net = self.snow.network conns = net['throat.conns'] - size_factors = ps.networks.diffusive_size_factor_DNS(regions, - throat_conns=conns, - voxel_size=voxel_size) + size_factors = ps.networks.diffusive_size_factor_DNS( + regions, + throat_conns=conns, + voxel_size=voxel_size, + ) values = np.array([1.43456123, 0.9612569, 1.22389664, 0.14359343, 0.18617079, 1.30144843, 0.22238891, 1.32222092])*voxel_size