空隙度分析 - CFAImageLAC

滑动盒和非重叠盒空隙度分析,积分图像加速

应用场景

使用示例

基础用法

import cv2 from FreeAeonFractal.FAImageLAC import CFAImageLAC from FreeAeonFractal.FAImage import CFAImage gray_image = cv2.imread('./images/fractal.png', cv2.IMREAD_GRAYSCALE) bin_image, threshold = CFAImage.otsu_binarize(gray_image) calc = CFAImageLAC(bin_image, partition_mode="gliding") lac_result = calc.get_lacunarity(use_binary_mass=True, include_zero=True) fit_result = calc.fit_lacunarity(lac_result) print("Lambda(r):", lac_result['lacunarity']) print("斜率 (beta):", fit_result['slope']) calc.plot(lac_result, fit_result)

GPU加速版本

from FreeAeonFractal.FAImageLACGPU import CFAImageLACGPU calc = CFAImageLACGPU(bin_image, device='cuda') lac_result = calc.get_lacunarity()

批量处理

import glob, cv2 from FreeAeonFractal.FAImageLAC import CFAImageLAC images = [cv2.imread(f, cv2.IMREAD_GRAYSCALE) for f in glob.glob('./images/*.png')] batch_results = CFAImageLAC.get_batch_lacunarity( images, partition_mode="gliding", use_binary_mass=True) batch_fits = CFAImageLAC.fit_batch_lacunarity(batch_results) for fit in batch_fits: print("斜率:", fit['slope'])

类说明

CFAImageLAC

初始化参数

参数类型默认值说明
imagenumpy.ndarray必填2D单通道图像
max_sizeintNone最大盒子尺寸
max_scalesint100目标尺度数量
scales_modestr"powers""powers"(2,4,8,...)或"logspace"
partition_modestr"gliding""gliding" 或 "non-overlapping"

get_lacunarity(corp_type=-1, use_binary_mass=False, include_zero=True)

计算Λ(r)。公式:Λ(r) = E[M²] / E[M]²。返回 dict:scales, lacunarity, mass_stats

fit_lacunarity(lac_result, transform="log", fit_range=None)

对数-对数回归拟合。transform="log":斜率=−β。

get_batch_lacunarity / fit_batch_lacunarity [静态]

批量处理,同形状gliding模式下向量化计算。

算法说明

Λ(r) = E[M²] / E[M]² = 1 + Var(M) / Mean(M)² # 滑动盒 — 积分图像 M(y, x) = S[y+r, x+r] - S[y, x+r] - S[y+r, x] + S[y, x] # 自相似分形标度律 Λ(r) ~ r^{−β} 其中 β = D − E

重要说明

  1. "gliding"统计上更稳健,通过积分图像保持高效;"non-overlapping"适合需要样本独立性的场景
  2. use_binary_mass=True 用于经典二值空隙度(Allain & Cloitre 1991)
  3. Λ=1表示完全均匀;Λ>1表示存在空隙和聚集