mercoledì 13 agosto 2025

Misura della dimensione frattale delle fratture

Visto che nel post precedente mi sono trovato praticamente servito il materiale, ho provato a calcolare la dimensione frattale delle fratture con un script Python  

 

 

 


Una volta ottenuta la dimensione frattale dell'affioramento si puo' tramite la legge

 

N(l) = numero di fratture osservabili al di sopra di una certa lunghezza 

D = dimensione frattale

 In funzione della scala di osservazione questo e' il numero di fratture attese


 

import numpy as np
import cv2
import matplotlib.pyplot as plt

def boxcount(Z, k):
    """Count the number of non-empty boxes of size k×k in a binary array Z."""
    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)

    # Count non-empty (at least 1 pixel > 0) boxes
    return len(np.where(S > 0)[0])

def fractal_dimension(image_path):
    # Load image in grayscale
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    if img is None:
        raise FileNotFoundError(f"Image not found: {image_path}")

    # Binarize image (fractures = white, background = black)
    _, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

    # Ensure binary array is 0-1
    Z = binary > 0

    # Minimal dimension of image
    p = min(Z.shape)

    # Max power of two less than p
    n = 2**np.floor(np.log2(p))
    n = int(n)

    # Extract the exponent sizes (k)
    sizes = 2**np.arange(int(np.log2(n)), 1, -1)

    counts = []
    for size in sizes:
        counts.append(boxcount(Z, size))

    # Linear fit in log-log space
    coeffs = np.polyfit(np.log(sizes), np.log(counts), 1)
    fractal_dim = -coeffs[0]

    # Plot result
    plt.figure()
    plt.scatter(np.log(sizes), np.log(counts), color='blue', label="Data")
    plt.plot(np.log(sizes), np.polyval(coeffs, np.log(sizes)), color='red', label=f"Fit (D={fractal_dim:.3f})")
    plt.xlabel("log(Box size)")
    plt.ylabel("log(Count)")
    plt.legend()
    plt.show()

    return fractal_dim

# Example usage:
image_path = "image.png"  
D = fractal_dimension(image_path)
print(f"Estimated fractal dimension: {D:.3f}")


 giusto per completezza nel caso di una distribuzione random dei pixel nell'immagine la dimensione frattale risultera' pari a 2





Nessun commento:

Posta un commento

Chiavetta ALIA

Sono maledettamente distratto e stavo cercando di vedere se riesco a replicare la chiavetta dei cassonetti di Firenze senza dover per forza ...