应用场景
CFAImageLAC 类用于计算2D图像的空隙度(Lacunarity),是量化图像空间分布不均匀性的重要工具。主要应用场景包括:
- 纹理分析:量化纹理的空隙和间隙特征
- 景观生态学:分析植被覆盖的空间分布
- 材料科学:研究材料孔隙结构
- 医学图像:分析组织分布的均匀性
- 城市规划:研究建筑物空间分布
调用示例
基础用法
# 读取图像
rgb_image = cv2.imread('./images/fractal.png') gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY)# 创建空隙度分析对象
lacunarity = CFAImageLAC( gray_image, max_scales=100, with_progress=True, partition_mode="gliding" # 或 "non-overlapping" )# 计算空隙度
lac_result = lacunarity.get_lacunarity( corp_type=-1, use_binary_mass=False, include_zero=True )# 拟合空隙度曲线
fit_result = lacunarity.fit_lacunarity(lac_result)# 输出结果
print("空隙度值:", lac_result["lacunarity"]) print("拟合斜率:", fit_result["slope"]) print("拟合R²:", fit_result["r_value"]**2)# 可视化
lacunarity.plot(lac_result, fit_result)二值图像分析
# 二值图像的空隙度
lacunarity_bin = CFAImageLAC(bin_image, partition_mode="gliding") lac_bin = lacunarity_bin.get_lacunarity(use_binary_mass=True) fit_bin = lacunarity_bin.fit_lacunarity(lac_bin)print("二值图像空隙度:", lac_bin["lacunarity"])
批量处理
images = [cv2.imread(f, cv2.IMREAD_GRAYSCALE) for f in glob.glob('./images/*.png')]
# 批量空隙度(CPU支持不同形状图像)
lac_results = CFAImageLAC.get_batch_lacunarity(images, max_scales=100) fit_results = CFAImageLAC.fit_batch_lacunarity(lac_results)for fit in fit_results:
print("斜率:", fit["slope"], "R²:", fit["r_value"]**2)对比不同分区模式
# 非重叠模式
lac_nonoverlap = CFAImageLAC(gray_image, partition_mode="non-overlapping") result_nonoverlap = lac_nonoverlap.get_lacunarity()# 可视化对比
import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1, figsize=(8, 5)) lac_gliding.plot(result_gliding, ax=ax, show=False, label="Gliding") lac_nonoverlap.plot(result_nonoverlap, ax=ax, show=False, label="Non-overlapping") plt.legend() plt.show()安装
类说明
CFAImageLAC
描述:用于计算2D图像空隙度的类,支持两种盒子分区策略。滑动盒模式使用积分图像(累积面积表)进行高效计算。初始化参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
image | numpy.ndarray | 必需 | 输入图像(灰度或二值) |
max_size | int | None | 最大盒子尺寸(默认为图像最小边长) |
max_scales | int | 100 | 最大尺度数量 |
with_progress | bool | True | 是否显示进度条 |
scales_mode | str | "powers" | 尺度生成模式("powers"或"logspace") |
partition_mode | str | "gliding" | 分区模式("gliding"或"non-overlapping") |
min_size | int | 2 | 最小盒子尺寸 |
"powers": 2的幂次尺度 (2, 4, 8, 16, ...)"logspace": 对数均匀分布的尺度
"gliding": 滑动窗口(重叠),使用积分图像高效计算,O(1)逐像素计算"non-overlapping": 非重叠固定块
主要方法
##### 1. get_lacunarity(corp_type=-1, use_binary_mass=False, include_zero=True)
描述:计算每个尺度下的空隙度。 参数:corp_type(int): 图像裁剪方式(仅非重叠模式)
-1: 自动裁剪
- 0: 不处理
- 1: 填充
use_binary_mass(bool): 是否使用二值质量
True: 只计数非零像素
- False: 使用实际像素值
include_zero(bool): 是否包含零质量盒子
mass_stats 中每个元素包含:
##### 2. fit_lacunarity(lac_result, transform="log", fit_range=None)
描述:对空隙度进行幂律拟合。 参数:lac_result(dict):get_lacunarity()的返回结果transform(str): 变换模式
"log": 标准对数-对数拟合,斜率 = -β(Allain & Cloitre)
- "log_minus_1": 拟合 log(Λ-1) vs log(r)
fit_range(tuple或None): 可选的 (min_scale, max_scale) 限制拟合范围
##### 3. get_batch_lacunarity(images, ...) [静态方法]
描述:对多个图像进行批量空隙度计算。CPU版本支持不同形状的图像。##### 4. fit_batch_lacunarity(lac_results, ...) [静态方法]
描述:批量拟合空隙度结果。##### 5. plot(lac_result, fit_result=None, ax=None, show=True, title="Lacunarity", label=None)
描述:可视化空隙度曲线和拟合结果。 参数:lac_result(dict): 空隙度结果fit_result(dict): 拟合结果(可选)ax: Matplotlib轴对象(可选)show(bool): 是否立即显示title(str): 图标题label(str): 曲线标签
理论背景
空隙度定义
空隙度 Λ(r) 定义为盒子质量的二阶矩与一阶矩平方的比值:
其中:
- M(r): 尺度为r的盒子质量
- E[·]: 期望值
物理意义
- Λ = 1: 完全均匀分布
- Λ > 1: 存在空隙,分布不均匀
- Λ越大: 空隙越多,聚集性越强
尺度律
空隙度通常遵循幂律(Allain & Cloitre):
其中β为空隙度指数。
两种分区策略
1. 滑动窗口(Gliding Box)
- 盒子重叠
- 使用积分图(Summed-Area Table)高效计算,O(1)逐像素计算
- 采样更密集,结果更平滑
- 计算复杂度:O(N·S),N为图像像素数,S为尺度数
2. 非重叠盒子(Non-overlapping Box)
- 盒子不重叠,平铺整个图像
- 采样较稀疏
- 计算更快
- 计算复杂度:O(N·S/r²)
重要提示
1. 分区模式选择:
-"gliding": 推荐用于一般分析,结果更平滑
- "non-overlapping": 更快,适合大图像
2. 质量模式:
-use_binary_mass=True: 二值图像或只关心占据情况
- use_binary_mass=False: 灰度图像,考虑强度信息
3. 尺度模式:
-"powers": 较少的尺度点,计算快
- "logspace": 更多尺度点,结果更精细
4. 零值处理:
-include_zero=True: 包含所有盒子
- include_zero=False: 只考虑非零盒子
5. 结果解释:
- 空隙度值范围:[1, +∞) - 斜率β:量化尺度依赖性 - R²接近1:良好的幂律拟合6. 性能优化:
- 使用partition_mode="non-overlapping" 加速
- 减少 max_scales 值
- 使用 scales_mode="powers"
- GPU版本(CFAImageLACGPU)适合大规模批处理(要求图像形状相同)
应用示例
景观分析
# 空隙度分析
lac_calc = CFAImageLAC(bin_veg, partition_mode="gliding") lac = lac_calc.get_lacunarity(use_binary_mass=True) fit = lac_calc.fit_lacunarity(lac)# 解释结果
beta = fit['slope'] if beta < 0: print(f"植被呈聚集分布,空隙度指数: {abs(beta):.3f}") else: print(f"植被呈均匀分布")材料孔隙分析
# 灰度空隙度
lac_gray = CFAImageLAC(material_image, max_scales=128) result = lac_gray.get_lacunarity(use_binary_mass=False)# 提取统计特征
mean_lac = np.mean(result['lacunarity']) max_lac = np.max(result['lacunarity'])print(f"平均空隙度: {mean_lac:.3f}")
print(f"最大空隙度: {max_lac:.3f}")常见问题
Q: 空隙度值 < 1 或 NaN?
A: 检查图像是否为空、是否有负值,或调整include_zero 参数。
Q: 如何选择分区模式?
A: 一般用 "gliding",大图像或追求速度用 "non-overlapping"。Q: 拟合效果不好?
A: 尝试调整scales_mode 或 max_scales,或切换 transform 参数。
Q: 灰度图用哪个质量模式?
A:use_binary_mass=False 保留灰度信息,True 只看分布。
参考文献
- Plotnick, R. E., et al. (1996). Lacunarity analysis: A general technique for the analysis of spatial patterns. Physical Review E.
- Allain, C., & Cloitre, M. (1991). Characterizing the lacunarity of random and deterministic fractal sets. Physical Review A.