MATLAB转Python图像分形维数盒计数代码报错,var1、var2部分问题求助
盒计数法计算图像分形维数Python代码排错
var1、var2相关代码段的核心问题
该段的报错和逻辑问题来自三个方面:
- 代码中使用了全角乘号
∗,属于非法字符,直接触发found bad_character报错,替换为半角乘号*即可解决 - minCol的计算逻辑错误,误用了boxrow的偏移量,应该使用
boxcol-1作为偏移计算参数,否则列索引逻辑完全错误 - 计算得到的minRow、maxRow、minCol、maxCol都是浮点类型,无法直接作为range参数和数组索引,需要强制转为整数
全部报错点汇总
- 全角符号问题:除了全角乘号,还有全角减号
−、全角单引号’,全部替换为半角符号即可解决语法类报错 - API调用错误:
cv2.imread()必须传入图像路径参数,留空会报错- 图像维度获取写法错误,应为
h, w, c = I.shape,不是I.cv2.shape - Numpy没有
padarray方法,对应填充功能使用np.pad实现,参数格式需要匹配Python接口要求 np.zeros初始化需要传入形状元组,比如np.zeros((1, int(power))),不能用逗号分隔两个参数- 数组元素访问使用方括号
[],不是MATLAB风格的圆括号(),I(row,col)要改为binaryIm[row, col](注意这里应该用二值图判断,不是原图) cv2.threshold的最大阈值参数应为255,8位灰度图最大值为255,传256会导致阈值逻辑错误
- 逻辑流程错误:
- 维度计算时power是浮点类型,需要转整数才能用于指数、数组初始化等场景
- 填充尺寸计算错误,
padRow = int(lengthNum - h)、padCol = int(lengthNum - w),不能直接减I.shape三元组 - 盒计数统计值、尺度值没有存入对应数组,boxNum、scale的更新逻辑放在了循环外部,导致统计数组全为0,后续拟合报错
- Python为0基索引,原MATLAB的1基索引要对应调整,避免索引越界
修正后完整可运行代码
import numpy as np import math as mt import cv2 # 替换为你的实际图像路径 I = cv2.imread("your_image_path.png") h, w, c = I.shape largerLength = max(h, w) power = int(np.ceil(mt.log2(largerLength))) lengthNum = 2 ** power # 转为二值图 grayIm = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY) ret, binaryIm = cv2.threshold(grayIm, 125, 255, cv2.THRESH_BINARY) # 计算填充尺寸,将图像补为边长等于lengthNum的正方形 padRow = lengthNum - h padCol = lengthNum - w # 后向填充0,对应MATLAB的post padding逻辑 padded_bin = np.pad(binaryIm, ((0, padRow), (0, padCol)), mode='constant', constant_values=0) boxCountstore = np.zeros((1, power)) scalestore = np.zeros((1, power)) boxNum = 1 for i in range(power): boxCount = 0 box_size = int(lengthNum / boxNum) # 遍历所有盒子 for boxrow in range(boxNum): for boxcol in range(boxNum): # 计算当前盒子的索引范围 minRow = boxrow * box_size maxRow = minRow + box_size minCol = boxcol * box_size maxCol = minCol + box_size # 直接用numpy接口判断盒子内是否有目标像素,比嵌套循环效率高很多 contain = np.any(padded_bin[minRow:maxRow, minCol:maxCol] > 0) if contain: boxCount += 1 # 存储当前尺度和对应盒计数 scalestore[0, i] = 1 / box_size boxCountstore[0, i] = boxCount # 更新下一轮的盒子数量 boxNum *= 2 # 最小二乘拟合log-log曲线,斜率即为分形维数 coeffs = np.polyfit(np.log(scalestore[0]), np.log(boxCountstore[0]), 1) FD = coeffs[0] print("分形维数计算结果:", FD)
内容的提问来源于stack exchange,提问作者MadLabMatLab
相关产品推荐
相关产品推荐

