Python多进程计算图像分形维数append()无关键字参数错误咨询
问题解答
一、报错原因与修复方案
报错原因
- 列表的
append()方法仅支持接收1个位置参数,你直接向append()传入target、args关键字参数,语法完全错误。你实际是要先实例化multiprocessing.Process对象,再把对象加入列表。 - 额外关联错误:
- 导入错误:
from multiprocessing import process导入的是小写的process模块,正确应该导入大写的Process类。 args参数要求传入元组,你直接传入数组会被解析为多个参数,调用函数时报参数数量错误。- 进程启动代码、结果统计代码放在
if __name__ == '__main__'外部,Windows系统下多进程会重复导入模块,导致逻辑错误。 - 多进程地址空间独立,无法通过全局变量
fracd收集子进程的返回结果,必须用进程间通信机制获取返回值。
- 导入错误:
修复代码
推荐使用更简单的Pool进程池实现,自动管理进程生命周期和结果收集:
from multiprocessing import Pool import numpy as np import imageio import warnings from PIL import Image warnings.simplefilter('ignore', Image.DecompressionBombWarning) Image.MAX_IMAGE_PIXELS = None def fractal_dimension(Z, threshold=0.8): """Returns box-counting dimension of a 2D array. Args: Z: 2D array to be analysed. threshold: Cutoff for converting values in Z to 1 and 0. Returns: The estimated box counting dimension. """ assert(len(Z.shape) == 2) def boxcount(Z, k): S = np.add.reduceat( np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), np.arange(0, Z.shape[1], k), axis=1) return len(np.where((S > 0) & (S < k*k))[0]) Z = (Z < threshold) p = min(Z.shape) n = 2**np.floor(np.log(p)/np.log(2)) n = int(np.log(n)/np.log(2)) sizes = 2**np.arange(n, 1, -1) counts = [] for size in sizes: counts.append(boxcount(Z, size)) coeffs = np.polyfit(np.log(sizes), np.log(counts), 1) return -coeffs[0] if __name__ =='__main__': I = imageio.imread(r"C:\Users\qkrgn\PycharmProjects\pythonProject\Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg", as_gray=True)/255.0 print("整图直接计算的分形维数:", fractal_dimension(I)) # 正确切分9个连续图像块(原代码跳步取像素是下采样操作,不是切分块) h, w = I.shape h_step, w_step = h//3, w//3 subsets = [ I[:h_step, :w_step], I[:h_step, w_step:2*w_step], I[:h_step, 2*w_step:], I[h_step:2*h_step, :w_step], I[h_step:2*h_step, w_step:2*w_step], I[h_step:2*h_step, 2*w_step:], I[2*h_step:, :w_step], I[2*h_step:, w_step:2*w_step], I[2*h_step:, 2*w_step:] ] # 批量计算9个块的分形维数 with Pool(9) as pool: fracd = pool.map(fractal_dimension, subsets) print("各块分形维数:", fracd) print("各块平均结果:", sum(fracd)/len(fracd))
二、分块计算合并方案的合理性
该方案无法得到正确的整图分形维数,原因如下:
- 盒计数分形维数是全局统计特征,依赖覆盖全图的所有尺度的盒子统计。拆分后每块的尺寸远小于原图,会丢失大尺度的纹理统计信息,平均结果和整图直接计算的结果存在明显偏差。
- 如果你的需求是统计图像不同区域的分形维数分布,那该方案是可行的,但要注意:原代码用
I[::3, ::3]的跳步方式是对原图做3倍下采样,不是切分原图像的连续块,要得到区域块需要按高度和宽度三等分切分,参考修复代码中的切分逻辑。
内容的提问来源于stack exchange,提问作者MadLabMatLab
相关产品推荐
相关产品推荐

