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

Kernel Panic QrCode

 In tanti anni ho visto qualche kernel panic, ma in questo formato non mi era mai successo    la cosa curiosa che al riavvio successivo ness...