boxcount

A method for measuring the fractal dimension of an image

import matplotlib.pyplot as plt
import numpy as np
import porespy as ps
[01:03:10] ERROR    PARDISO solver not installed, run `pip install pypardiso`. Otherwise,          _workspace.py:56
                    simulations will be slow. Apple M chips not supported.                                         

The arguments and their defaults for this function are:

import inspect
inspect.signature(ps.metrics.boxcount)
<Signature (im, bins=10)>
im = ps.generators.sierpinski_foam(dmin=5, n=5, ndim=2)
fig, ax = plt.subplots(1, 1, figsize=[6, 6])
ax.imshow(im, interpolation='none', origin='lower')
ax.axis(False);
../../../_images/614ffa2868eaeec1ae720ce31e2554391b6239b454af3220d430c1c6362ffb9f.png

im

The image which is to be analzyed. Can be 2D or 3D.

b = ps.metrics.boxcount(im=im)
print(b)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
Results of boxcount generated at Mon Sep 16 01:03:12 2024
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
size                      Array of size (10,)
count                     [np.int64(6505), np.int64(4095), np.int64(1435), np.int64(552), np.int64(206), np.int64(77), np.int64(24), np.int64(9), np.int64(4), np.int64(1)]
slope                     Array of size (10,)
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

The returned object is like a dataclass with each computed value stored in an attribute. The result can be printed for inspection. The results can also be plotted as follows:

fig, ax = plt.subplots(1, 2, figsize=[12, 6])
ax[0].loglog(b.size, b.count)
ax[0].set_xlabel('box length')
ax[0].set_ylabel('number of partially filled boxes')

ax[1].semilogx(b.size, b.slope)
ax[1].plot([0, 1000], [1.9, 1.9])
ax[1].set_xlabel('box length')
ax[1].set_ylabel('slope')
ax[1].set_ylim([0, 3]);
../../../_images/815b425c8f247bd2b69004c24a992a0886da4520a38080dd1a214aac41e5a01b.png

bins

The box sizes to use. The default is 10. If an integer is given it computes the range of box sizes. If an array is given, these are used directly

b = ps.metrics.boxcount(im=im, bins=20)
fig, ax = plt.subplots(1, 2, figsize=[12, 6])
ax[0].loglog(b.size, b.count)
ax[0].set_xlabel('box length')
ax[0].set_ylabel('number of partially filled boxes')

ax[1].semilogx(b.size, b.slope)
ax[1].plot([0, 1000], [1.9, 1.9])
ax[1].set_xlabel('box length')
ax[1].set_ylabel('slope')
ax[1].set_ylim([0, 3]);
../../../_images/25ff4a8ba6a1f604176cf4b9b030cae147d73d1fb66c314b05a39a1863bd209e.png