Source code for porespy.filters._morphology

import numpy as np
from scipy.signal import fftconvolve
from porespy.tools import (
    ps_round,
    get_edt
)


edt = get_edt()


__all__ = [
    'erode',
    'dilate',
]


[docs] def erode(im, r, dt=None, method='dt', smooth=True): from porespy import settings if dt is None: dt = edt(im, parallel=settings.ncores) if method == 'dt': ero = dt >= r if smooth else dt > r elif method.startswith('conv'): se = ps_round(r=r, ndim=im.ndim, smooth=smooth) ero = ~(fftconvolve(~im, se, mode='same') > 0.1) return ero
[docs] def dilate(im, r, method='dt', smooth=True): from porespy import settings im = im == 1 if method == 'dt': dt = edt(~im, parallel=settings.ncores) dil = dt < r if smooth else dt <= r dil += im elif method.startswith('conv'): se = ps_round(r=r, ndim=im.ndim, smooth=smooth) dil = fftconvolve(im, se, mode='same') > 0.1 return dil
if __name__ == "__main__": import porespy as ps import matplotlib.pyplot as plt im = ps.generators.blobs([200, 200], porosity=0.6, seed=5) ero1 = erode(im, 5, method='dt').astype(int) ero1[~im] = -1 ero2 = erode(im, 5, method='conv').astype(int) ero2[~im] = -1 fig, ax = plt.subplots(2, 2) ax[0][0].imshow(ero1) ax[0][1].imshow(ero2) ero1 = erode(im, 10, method='dt').astype(int) dil1 = dilate(ero1, 10, method='dt').astype(int) dil1[~im] = -1 dil2 = dilate(ero1, 10, method='conv').astype(int) dil2[~im] = -1 ax[1][0].imshow(dil1) ax[1][1].imshow(dil2)