apply_padded#

Applies padding to an image before passing through specified function

Import packages#

import numpy as np
import porespy as ps
import scipy.ndimage as spim
import matplotlib.pyplot as plt
import skimage
from edt import edt
ps.visualization.set_mpl_style()

im#

Generate a test image. Can be 2D or 3D image.

im = np.zeros([300, 300])
im = ps.generators.rsa(im, r=20, volume_fraction=0.4) == 0

plt.figure(figsize=[6, 6])
plt.axis(False)
plt.imshow(im);
../../../_images/17bd33d8ecb694b10bf5cb1a5418d23f15057ee509c8151fa648610bf73aa609.svg

func#

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.

func = skimage.morphology.skeletonize_3d

pad_width#

The amount of padding to add to each axis

x1 = ps.filters.apply_padded(im=im, pad_width=1, func=func, pad_val=1)
x2 = ps.filters.apply_padded(im=im, pad_width=100, func=func, pad_val=1)

fig, ax = plt.subplots(1, 2, figsize=[12, 12]);
ax[0].imshow(x1);
ax[0].axis(False)
ax[0].set_title('pad_width = 1')
ax[1].imshow(x2);
ax[1].axis(False)
ax[1].set_title('pad_width = 100');
../../../_images/abeb1e0ade1b8ef91745a2f5f38c5a449a46c17710fffee244004efcae73c24b.svg

It’s also useful for morphological operations such as binary_opening

func = skimage.morphology.binary_opening
x3 = ps.filters.apply_padded(im=im, pad_width=0, func=func, pad_val=1, selem=ps.tools.ps_disk(15))
x4 = ps.filters.apply_padded(im=im, pad_width=50, func=func, pad_val=1, selem=ps.tools.ps_disk(15))

fig, ax = plt.subplots(1, 2, figsize=[12, 12]);
ax[0].imshow(x3)
ax[0].axis(False)
ax[0].set_title('With no padding')
ax[1].imshow(x4)
ax[1].axis(False)
ax[1].set_title('With padding');
/home/runner/work/porespy/porespy/porespy/filters/_funcs.py:54: FutureWarning: `selem` is a deprecated argument name for `binary_opening`. It will be removed in version 1.0. Please use `footprint` instead.
  temp = func(padded, **kwargs)
../../../_images/4d66b6a5b1c8886c1954f4e955dc288b572a2ef61ad2cb6f4b12a118c20292f6.svg

pad_val#

The value to be placed in padded voxels. It is almost always 1 but setting to 0 may be useful for applying a distance transform.

func = edt
x5 = ps.filters.apply_padded(im=im, pad_width=10, func=func, pad_val=1)
x6 = ps.filters.apply_padded(im=im, pad_width=10, func=func, pad_val=0)

fig, ax = plt.subplots(1, 2, figsize=[12, 12]);
ax[0].imshow(x5);
ax[0].axis(False)
ax[0].set_title('pad_val = 1')
ax[1].imshow(x6);
ax[1].axis(False)
ax[1].set_title('pad_val = 0');
../../../_images/3fdf624948c7da1472367e03008ed0be5020ae65d1f5fab976579c1a1817f9bd.svg