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