应用领域
| 领域 | 应用 | 相关模块 |
|---|---|---|
| 医学影像分析 | 组织复杂度、异质性分析 | 多重分形谱、分形维度 |
| 材料科学 | 表面形貌、孔隙结构 | 分形维度、空隙度 |
| 金融分析 | 价格波动、风险评估 | 序列多重分形谱 |
| 地球科学 | 地形分析、植被分布 | 分形维度、空隙度 |
| 图像处理 | 纹理分类、图像分割 | 所有模块 |
安装
pip install FreeAeon-Fractal
系统要求:
- Python 3.6+
- OpenCV (cv2) 支持
序列分析额外依赖: pip install MFDFA
GPU加速: pip install torch --index-url https://download.pytorch.org/whl/cu118
功能模块
| 模块 | 类名 | 功能 | 文档 |
|---|---|---|---|
| 多重分形谱 | CFAImageMFS | 2D图像多重分形谱、局部奇异度图 | 查看 |
| CFASeriesMFS | 1D序列多重分形谱(MFDFA) | 查看 | |
| 分形维度 | CFAImageFD | BC/DBC/SDBC方法、批量处理 | 查看 |
| 空隙度 | CFAImageLAC | 滑动/非重叠盒、积分图像加速 | 查看 |
| 傅里叶分析 | CFAImageFourier | 频谱分析、自定义掩码滤波、重构 | 查看 |
| 图像工具 | CFAImage | 分块、二值化、ROI提取 | 查看 |
| 可视化 | CFAVisual | 1D/2D/3D点集和图像显示 | 查看 |
| 分形样本生成 | CFASample | 康托集、谢尔宾斯基、巴恩斯利蕨、门格海绵 | 查看 |
| GPU加速 | *GPU版本 | 3–20×速度提升 | 查看 |
快速开始
计算图像多重分形谱
import cv2, numpy as np
from FreeAeonFractal.FAImageMFS import CFAImageMFS
rgb_image = cv2.imread('./images/face.png')
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY)
MFS = CFAImageMFS(gray_image, q_list=np.linspace(-5, 5, 26))
df_mass, df_fit, df_spec = MFS.get_mfs()
MFS.plot(df_mass, df_fit, df_spec)
计算分形维度
from FreeAeonFractal.FAImageFD import CFAImageFD from FreeAeonFractal.FAImage import CFAImage bin_image, threshold = CFAImage.otsu_binarize(gray_image) fd_bc = CFAImageFD(bin_image).get_bc_fd() fd_dbc = CFAImageFD(gray_image).get_dbc_fd() fd_sdbc = CFAImageFD(gray_image).get_sdbc_fd() CFAImageFD.plot(rgb_image, gray_image, bin_image, fd_bc, fd_dbc, fd_sdbc)
局部奇异度图
MFS = CFAImageMFS(gray_image) alpha_map, info = MFS.compute_alpha_map() CFAImageMFS.plot_alpha_map(alpha_map)
空隙度分析
from FreeAeonFractal.FAImageLAC import CFAImageLAC calc = CFAImageLAC(gray_image, partition_mode="gliding") lac_result = calc.get_lacunarity() fit_result = calc.fit_lacunarity(lac_result) calc.plot(lac_result, fit_result)
傅里叶分析
from FreeAeonFractal.FAImageFourier import CFAImageFourier
fourier = CFAImageFourier(rgb_image)
mag_disp, phase_disp = fourier.get_display_spectrum(alpha=1.5)
full_reconstructed = fourier.get_reconstruct()
fourier.plot(raw_magnitude_disp=mag_disp, raw_phase_disp=phase_disp,
full_reconstructed=full_reconstructed)
序列多重分形谱
from FreeAeonFractal.FASeriesMFS import CFASeriesMFS x = np.cumsum(np.random.randn(5000)) mfs = CFASeriesMFS(x, q_list=np.linspace(-5, 5, 21)) df_mfs = mfs.get_mfs() mfs.plot(df_mfs)
命令行使用
python demo.py --mode mfs --image ./images/face.png python demo.py --mode fd --image ./images/fractal.png python demo.py --mode alpha --image ./images/face.png python demo.py --mode lacunarity --image ./images/fractal.png python demo.py --mode fourier --image ./images/face.png python demo.py --mode series
demo.py 完整示例
以下为 demo.py 中各 --mode 对应的完整Python代码。
mode=fd — 分形维度
import cv2, time, numpy as np
from FreeAeonFractal.FAImageFD import CFAImageFD
from FreeAeonFractal.FAImage import CFAImage
rgb_image = cv2.cvtColor(cv2.imread('./images/face.png'), cv2.COLOR_BGR2RGB)
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
bin_image, threshold = CFAImage.otsu_binarize(gray_image)
max_scales = 32
# --- 单张图像 ---
t0 = time.time()
fd_bc = CFAImageFD(bin_image, max_scales=max_scales).get_bc_fd(corp_type=-1)
fd_dbc = CFAImageFD(gray_image, max_scales=max_scales).get_dbc_fd(corp_type=-1)
fd_sdbc = CFAImageFD(gray_image, max_scales=max_scales).get_sdbc_fd(corp_type=-1)
print(f"单张图像: {time.time()-t0:.3f}s")
print(" BC:", fd_bc['fd'], " DBC:", fd_dbc['fd'], " SDBC:", fd_sdbc['fd'])
CFAImageFD.plot(rgb_image, gray_image, bin_image, fd_bc, fd_dbc, fd_sdbc)
# --- 批量(100张)---
t0 = time.time()
bc_list = CFAImageFD.get_batch_bc([bin_image]*100, max_scales=max_scales, with_progress=False)
dbc_list = CFAImageFD.get_batch_dbc([gray_image]*100, max_scales=max_scales, with_progress=False)
sdbc_list = CFAImageFD.get_batch_sdbc([gray_image]*100, max_scales=max_scales, with_progress=False)
print(f"批量(100张): {time.time()-t0:.3f}s")
print(f" BC[99]={bc_list[99]['fd']:.4f} DBC[99]={dbc_list[99]['fd']:.4f} SDBC[99]={sdbc_list[99]['fd']:.4f}")
CFAImageFD.plot(rgb_image, gray_image, bin_image, bc_list[99], dbc_list[99], sdbc_list[99])
mode=mfs — 多重分形谱
import cv2, time, numpy as np
from FreeAeonFractal.FAImageMFS import CFAImageMFS
rgb_image = cv2.cvtColor(cv2.imread('./images/face.png'), cv2.COLOR_BGR2RGB)
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
q_list = np.linspace(-10, 10, 101)
# --- 单张图像 ---
t0 = time.time()
MFS = CFAImageMFS(gray_image, q_list=q_list)
df_mass, df_fit, df_spec = MFS.get_mfs()
print(f"单张MFS: {time.time()-t0:.3f}s"); print(df_fit.head())
MFS.plot(df_mass, df_fit, df_spec)
# --- 批量(20张)---
t0 = time.time()
batch_results = CFAImageMFS.get_batch_mfs(
[gray_image]*20, with_progress=False, q_list=q_list, corp_type=-1,
bg_reverse=False, bg_threshold=0.01, bg_otsu=False, max_scales=80,
min_points=6, use_middle_scales=False, if_auto_line_fit=False,
fit_scale_frac=(0.3, 0.7), auto_fit_min_len_ratio=0.6, cap_d0_at_2=False)
df_mass1, df_fit1, df_spec1 = batch_results[0]
print(f"批量MFS(20张): {time.time()-t0:.3f}s"); print(df_fit1.head())
MFS.plot(df_mass1, df_fit1, df_spec1)
mode=alpha — 局部奇异度图
import cv2, time, numpy as np
from FreeAeonFractal.FAImageMFS import CFAImageMFS
rgb_image = cv2.cvtColor(cv2.imread('./images/face.png'), cv2.COLOR_BGR2RGB)
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
q_list = np.linspace(-5, 5, 51)
scales = list(range(1, 100))
# --- 单张图像 ---
t0 = time.time()
MFS = CFAImageMFS(gray_image, q_list=q_list)
alpha_map, info = MFS.compute_alpha_map(scales=scales)
print(f"单张alpha_map: {time.time()-t0:.3f}s")
print(" alpha map:", alpha_map, "\n scale info:", info)
CFAImageMFS.plot_alpha_map(alpha_map)
# --- 批量(20张)---
t0 = time.time()
batch_alpha_map = CFAImageMFS.compute_alpha_map_batch([gray_image]*20, with_progress=False, scales=scales)
alpha_maps, infos = batch_alpha_map[0], batch_alpha_map[1]
print(f"批量alpha_map(20张): {time.time()-t0:.3f}s")
CFAImageMFS.plot_alpha_map(alpha_maps[0])
mode=lacunarity — 空隙度分析
import cv2, time
from FreeAeonFractal.FAImageLAC import CFAImageLAC
rgb_image = cv2.cvtColor(cv2.imread('./images/fractal.png'), cv2.COLOR_BGR2RGB)
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2GRAY)
lacunarity = CFAImageLAC(gray_image, max_scales=256, with_progress=True)
# --- 单张图像 ---
t0 = time.time()
lac_gray = lacunarity.get_lacunarity(corp_type=-1, use_binary_mass=False, include_zero=True)
fit_gray = lacunarity.fit_lacunarity(lac_gray)
print(f"单张空隙度: {time.time()-t0:.3f}s")
print(" 斜率:", fit_gray["slope"], " R:", fit_gray["r_value"], " P:", fit_gray["p_value"])
lacunarity.plot(lac_gray, fit_gray)
# --- 批量(100张)---
t0 = time.time()
batchs = CFAImageLAC.get_batch_lacunarity(
[gray_image]*100, scales_mode="powers", partition_mode="gliding",
use_binary_mass=False, with_progress=False)
fits = CFAImageLAC.fit_batch_lacunarity(batchs)
print(f"批量空隙度(100张): {time.time()-t0:.3f}s")
print(" 斜率:", fits[99]["slope"], " R:", fits[99]["r_value"])
lacunarity.plot(batchs[99], fits[99])
mode=fourier — 傅里叶分析
import cv2, numpy as np
from FreeAeonFractal.FAImageFourier import CFAImageFourier
rgb_image = cv2.cvtColor(cv2.imread('./images/face.png'), cv2.COLOR_BGR2RGB)
fourier = CFAImageFourier(rgb_image) # 支持灰度图和RGB图
raw_mag, raw_phase = fourier.get_raw_spectrum()
raw_mag_disp, raw_phase_disp = fourier.get_display_spectrum(alpha=1.5)
# 创建自定义频率掩码(示例:保留奇数频率分量)
h, w = raw_mag[0].shape
Y, X = np.ogrid[:h, :w]
mask = ((X % 2 == 1) & (Y % 2 == 1)).astype(np.uint8)
customized_mag_list = raw_mag * mask
customized_phase_list = raw_phase * mask
customized_mag_disp, customized_phase_disp = fourier.get_display_spectrum(
alpha=1.5, magnitude=customized_mag_list, phase=customized_phase_list)
full_reconstructed = fourier.get_reconstruct()
masked_reconstructed = fourier.extract_by_freq_mask(mask)
fourier.plot(raw_mag_disp, raw_phase_disp,
customized_mag_disp, customized_phase_disp,
full_reconstructed, masked_reconstructed)
print(masked_reconstructed)
mode=series — 序列多重分形谱
import numpy as np from FreeAeonFractal.FASeriesMFS import CFASeriesMFS x = np.cumsum(np.random.randn(5000)) # 随机游走示例数据 mfs = CFASeriesMFS(x) df_mfs = mfs.get_mfs() mfs.plot(df_mfs) print(df_mfs)