分形维度分析 - CFAImageFD

图像分形维度计算 (BC, DBC, SDBC)

应用场景

CFAImageFD 类用于计算2D图像的分形维度,是图像复杂度分析和纹理特征提取的重要工具。主要应用场景包括:

调用示例

基础用法

import cv2 from FreeAeonFractal.FAImageFD import CFAImageFD from FreeAeonFractal.FAImage import CFAImage

# 读取图像

rgb_image = cv2.imread('./images/fractal.png') gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY)

# 对于BC方法,需要二值化图像

bin_image, threshold = CFAImage.otsu_binarize(gray_image)

# 计算三种分形维度

fd_bc = CFAImageFD(bin_image).get_bc_fd(corp_type=-1) fd_dbc = CFAImageFD(gray_image).get_dbc_fd(corp_type=-1) fd_sdbc = CFAImageFD(gray_image).get_sdbc_fd(corp_type=-1)

# 输出结果

print("BC分形维度:", fd_bc['fd']) print("DBC分形维度:", fd_dbc['fd']) print("SDBC分形维度:", fd_sdbc['fd'])

# 可视化结果

CFAImageFD.plot(rgb_image, gray_image, bin_image, fd_bc, fd_dbc, fd_sdbc)

GPU加速版本

from FreeAeonFractal.FAImageFDGPU import CFAImageFDGPU

# GPU加速计算

fd_bc = CFAImageFDGPU(bin_image, device='cuda').get_bc_fd() fd_dbc = CFAImageFDGPU(gray_image, device='cuda').get_dbc_fd() fd_sdbc = CFAImageFDGPU(gray_image, device='cuda').get_sdbc_fd()

# 注意:GPU版本的p_value为None(不计算)

print(f"BC (GPU): {fd_bc['fd']:.4f}") print(f"DBC (GPU): {fd_dbc['fd']:.4f}")

批量处理

import glob, cv2 from FreeAeonFractal.FAImageFD import CFAImageFD

images = [cv2.imread(f, cv2.IMREAD_GRAYSCALE) for f in glob.glob('./images/*.png')]

results = CFAImageFD.get_batch_bc(images) for r in results: print("BC FD:", r['fd'])

安装

pip install FreeAeon-Fractal

类说明

CFAImageFD

描述:用于计算2D图像分形维度的类,支持Box-Counting(BC)、差分Box-Counting(DBC)和移位DBC(SDBC)三种计算方法。

初始化参数

参数类型默认值说明
imagenumpy.ndarray必需输入图像(单通道)
max_sizeintNone最大盒子尺寸(默认为图像最小边长)
max_scalesint30最大尺度数量
with_progressboolTrue是否显示进度条
min_sizeint2最小盒子尺寸

主要方法

##### 1. get_bc_fd(corp_type=-1, fit_range=None)

描述:使用盒计数(Box-Counting, BC)方法计算分形维度。 参数 - -1: 自动裁剪到盒子尺寸的倍数 - 0: 不处理(需要图像尺寸已是盒子尺寸的倍数) - 1: 填充 返回值 (dict):
{ 'fd': float, # 分形维度值 'scales': list, # 尺度列表 'counts': list, # 盒子计数列表 'log_scales': list, # 对数尺度 'log_counts': list, # 对数计数 'intercept': float, # 拟合截距 'r_value': float, # 相关系数 'p_value': float, # p值 'std_err': float # 标准误差 }
适用场景:适用于二值图像,计算其占据空间的维度。

##### 2. get_dbc_fd(corp_type=-1, fit_range=None)

描述:使用差分盒计数(Differential Box-Counting, DBC)方法(Sarkar & Chaudhuri 1994)计算分形维度。使用 n_r = ceil(I_max/h) - ceil(I_min/h) + 1参数:同 get_bc_fd 返回值:同 get_bc_fd 适用场景:适用于灰度图像,考虑灰度信息的分形维度计算。

##### 3. get_sdbc_fd(corp_type=-1, fit_range=None)

描述:使用移位差分盒计数(Shifted DBC, SDBC)方法(Chen 1995)计算分形维度。使用 n_r = floor((I_max - I_min)/h) + 1,避免了原始DBC公式中的舍入误差。 参数:同 get_bc_fd 返回值:同 get_bc_fd 适用场景:SDBC是DBC的改进版本,使用更简化的计算方式。

##### 4. get_fd(scale_list, box_count_list)

描述:对自定义尺度和计数数据执行对数-对数拟合的工具方法。 返回值:与 get_bc_fd 相同的字典结构。

##### 5. plot(raw_img, gray_img, bin_img, fd_bc, fd_dbc, fd_sdbc)

描述:静态方法,可视化原始图像、灰度图像、二值图像和三种分形维度的拟合结果。 参数

##### 6. get_batch_bc / get_batch_dbc / get_batch_sdbc(images, ...)

描述:用于批量处理多个图像的静态方法。 返回值:结果字典列表。

算法说明

BC (Box-Counting) 方法

盒计数法通过在不同尺度下统计覆盖图像所需的非空盒子数量来计算分形维度。计算公式为:
D = lim(ε→0) log(N(ε)) / log(1/ε)

其中 N(ε) 是尺度为 ε 时的盒子数量。

DBC (Differential Box-Counting) 方法

差分盒计数法考虑灰度值的高度信息,将图像视为三维表面。每个盒子的高度为:
n_r = ceil(I_max / h) - ceil(I_min / h) + 1

其中 h = max_val / (image_size / r) 是灰度单元的高度。

SDBC (Shifted DBC) 方法

移位差分盒计数法使用简化的高度计算,避免了原始DBC公式中的舍入误差:
n_r = floor((I_max - I_min) / h) + 1

重要提示

1. 图像预处理

- BC方法需要二值图像,建议使用Otsu自动阈值化 - DBC和SDBC方法适用于灰度图像

2. 尺度选择

- max_size 影响分析的尺度范围 - max_scales 影响采样密度,默认值为30 - 使用 fit_range 排除不可靠的小/大尺度

3. 结果解释

- 分形维度范围通常在1-2之间(2D图像) - 值越大表示图像越复杂 - r_value 接近1表示良好的幂律拟合

4. 性能优化

- 对于大图像,可以先降采样 - 设置 with_progress=False 可以提高计算速度 - 批量处理使用GPU版本(CFAImageFDGPU) - 注意:GPU版本的 p_valueNone(不计算)

参考文献