# lineal_path_distribution#

Determines the probability that a point lies within a certain distance of the opposite phase along a specified direction. This metrics finds the histogram data of the lineal paths in the image. Lineal path is related to the chord length. The difference is that chords are drawn from a boundary of the phase of interest until they reach another boundary, while a lineal path is started from a random location in the phase and extended until is reaches a phase boundary.

import matplotlib.pyplot as plt
import numpy as np
import porespy as ps

/opt/hostedtoolcache/Python/3.8.16/x64/lib/python3.8/site-packages/openpnm/algorithms/_invasion_percolation.py:358: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.
def _find_trapped_pores(inv_seq, indices, indptr, outlets):  # pragma: no cover


Let’s first create a test image by obtaining lineal path for every starting point in the binary image:

import porespy as ps
import matplotlib.pyplot as plt

im_binary = ps.generators.blobs(shape=[100, 100], blobiness=[1, 1], porosity=0.75)
im = ps.filters.distance_transform_lin(im=im_binary, axis=0, mode='forward')
fig, ax = plt.subplots(1, 1, figsize=[4, 4])
ax.imshow(im/im_binary, origin='lower', interpolation='none') # division by zero is shown as white regions
ax.axis(False); Now the test image is ready to be passed to lineal_path_distribution. The method returns a custom object with information of the distribution of the lineal path lengths.

data = ps.metrics.lineal_path_distribution(im)
fig, ax = plt.subplots(1, 3, figsize=[10, 4])
ax.plot(data.L,data.pdf)
ax.plot(data.L,data.cdf)
ax.bar(data.L, data.cdf, data.bin_widths, edgecolor='k')
ax.set_title("Probability Density Function")
ax.set_title("Cumulative Density Function")
ax.set_title('Bar Plot'); ## bins#

The default number of bins for the histogram is 10. Let’s increase the bins to 100:

data = ps.metrics.lineal_path_distribution(im, bins=100)
fig, ax = plt.subplots(1, 3, figsize=[10, 4])
ax.plot(data.L,data.pdf)
ax.plot(data.L,data.cdf)
ax.bar(data.L, data.cdf, data.bin_widths, edgecolor='k')
ax.set_title("Probability Density Function")
ax.set_title("Cumulative Density Function")
ax.set_title('Bar Plot'); ## log#

We can get the histogram of logarithm (base-10) of lineal path lengths. This can help to plot wide size distributions or to better visualize the data in the small size region. The resulting histogram binning is then performed on the logged lineal path length values.

data = ps.metrics.lineal_path_distribution(im=im, log=True)
fig, ax = plt.subplots(1, 3, figsize=[10, 4])
ax.plot(data.LogL,data.pdf)
ax.plot(data.LogL,data.cdf)
ax.bar(data.LogL, data.cdf, data.bin_widths, edgecolor='k')
ax.set_title("Probability Density Function")
ax.set_title("Cumulative Density Function")
ax.set_title('Bar Plot'); ## voxel_size#

By default the voxel_size is 1. We can assign voxel size of the image as the input or apply the scaling on the results after the fact:

voxel_size=1e-3
data = ps.metrics.lineal_path_distribution(im=im, voxel_size=voxel_size)
fig, ax = plt.subplots(1, 2, figsize=[10, 4])
ax.bar(data.L, data.cdf, data.bin_widths, edgecolor='k')
ax.set_title("PDF scaling included in the result")
data = ps.metrics.lineal_path_distribution(im=im)
ax.bar(data.L*voxel_size, data.cdf, data.bin_widths*voxel_size, edgecolor='k')
ax.set_title("PDF scaling after the result"); 