Source code for pywsi.segmentation.fractal_dimension

# -----------------------------------------------------------------------------
# From https://en.wikipedia.org/wiki/Minkowski-Bouligand_dimension:
#
# In fractal geometry, the Minkowski-Bouligand dimension, also known as
# Minkowski dimension or box-counting dimension, is a way of determining the
# fractal dimension of a set S in a Euclidean space Rn, or more generally in a
# metric space (X, d).
# -----------------------------------------------------------------------------
import warnings
warnings.filterwarnings("ignore")

import scipy.misc
import numpy as np


[docs]def fractal_dimension(Z, threshold=0.9): # Only for 2d image assert (len(Z.shape) == 2) # From https://github.com/rougier/numpy-100 (#87) def boxcount(Z, k): S = np.add.reduceat( np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), np.arange(0, Z.shape[1], k), axis=1) # We count non-empty (0) and non-full boxes (k*k) return len(np.where((S > 0) & (S < k * k))[0]) # Transform Z into a binary array Z = (Z < threshold) # Minimal dimension of image p = min(Z.shape) # Greatest power of 2 less than or equal to p n = 2**np.floor(np.log(p) / np.log(2)) # Extract the exponent n = int(np.log(n) / np.log(2)) # Build successive box sizes (from 2**n down to 2**1) sizes = 2**np.arange(n, 1, -1) # Actual box counting with decreasing size counts = [] for size in sizes: counts.append(boxcount(Z, size)) # Fit the successive log(sizes) with log (counts) try: coeffs = np.polyfit(np.log(sizes), np.log(counts), 1) except TypeError: return p return -coeffs[0]