分形盒计数函数异常:Python实现中各网格尺寸下N恒为1的问题排查
盒计数法代码修复方案
原代码的核心问题:
- 提前返回导致计数中断:
count函数中,找到第一个包含目标像素(值为0)的盒子后立刻return N,直接终止了后续的计数循环,所以所有尺寸对应的N都只能是1。 - 切片范围错误:
img_matrix[i:step,j:step]的写法错误,应该取当前盒子的区域image[i:i+size, j:j+size],否则每次都只检查从0到size的左上角区域。 - 变量不统一+未定义问题:函数参数是
image,内部却用了未传入的img_matrix;Lx和Ly没有定义,需要从输入图像的尺寸获取。 - 无效的盒子尺寸:
size=np.arange(0,10,1)包含了0,步长为0会引发循环错误,盒子尺寸应从1开始。
修正后的代码:
import numpy as np def count(image, size): N = 0 Lx, Ly = image.shape[:2] # 从输入图像获取尺寸 step = size # 遍历所有盒子的左上角坐标 for i in range(0, Lx, step): for j in range(0, Ly, step): # 确保切片不超出图像边界(处理图像尺寸不能被size整除的情况) box = image[i:i+step, j:j+step] if (box == 0).any(): # 检查当前盒子是否包含目标像素 N += 1 return N # 遍历完所有盒子后再返回总数 # 生成测试图像(示例,替换为你的实际图像矩阵) img = np.random.randint(0, 2, size=(50, 50)) # 盒子尺寸从1到9,步长1 sizes = np.arange(1, 10, 1) Ns = [] for s in sizes: current_N = count(img, s) Ns.append(current_N) print(Ns)
额外说明:
- 加入了边界处理:当图像尺寸不能被盒子尺寸整除时,最后一行/列的盒子会自动取到图像边缘,避免索引越界。
- 替换了测试图像,你需要把
img换成自己的实际图像矩阵。 - 现在
Ns会正确记录每个盒子尺寸对应的非空盒子数量,后续可以通过log(Ns)和log(1/sizes)做线性拟合得到分形维度。
内容的提问来源于stack exchange,提问作者meak
相关产品推荐
相关产品推荐

