我目前正在做一个项目,使多处理分形维数计算程序。
我设计了代码,以便它首先将大图像分割为9个部分,并计算每个部分的分形维数。
from multiprocessing import process
import numpy as np
import os
import math as mt
import cv2
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.
"""
# Only for 2d image
assert(len(Z.shape) == 2)
# From https://github.com/rougier/numpy-100 (#87)
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)
# We count non-empty (0) and non-full boxes (k*k)
return len(np.where((S > 0) & (S < k*k))[0])
# Transform Z into a binary array
Z = (Z < threshold)
# Minimal dimension of image
p = min(Z.shape)
# Greatest power of 2 less than or equal to p
n = 2**np.floor(np.log(p)/np.log(2))
# Extract the exponent
n = int(np.log(n)/np.log(2))
# Build successive box sizes (from 2**n down to 2**1)
sizes = 2**np.arange(n, 1, -1)
# Actual box counting with decreasing size
counts = []
for size in sizes:
counts.append(boxcount(Z, size))
# Fit the successive log(sizes) with log (counts)
coeffs = np.polyfit(np.log(sizes), np.log(counts), 1)
#fracd.append(coeffs)
return -coeffs[0]
I = imageio.imread(r"C:\Users\qkrgn\PycharmProjects\pythonProject\Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg", as_gray="True")/255.0 # Import the image in greyscale
print("Minkowski–Bouligand dimension (computed): ", fractal_dimension(I))
subset_9t1 = I[::3, ::3]
subset_9t2 = I[1::3, ::3]
subset_9t3 = I[2::3, ::3]
subset_9t4 = I[::3, 1::3]
subset_9t5 = I[1::3, 1::3]
subset_9t6 = I[2::3, 1::3]
subset_9t7 = I[::3, 2::3]
subset_9t8 = I[1::3, 2::3]
subset_9t9 = I[2::3, 2::3]
if __name__ =='__main__':
processes:list = []
processes.append(target=fractal_dimension, args=subset_9t1)
processes.append(target=fractal_dimension, args=subset_9t2)
processes.append(target=fractal_dimension, args=subset_9t3)
processes.append(target=fractal_dimension, args=subset_9t4)
processes.append(target=fractal_dimension, args=subset_9t5)
processes.append(target=fractal_dimension, args=subset_9t6)
processes.append(target=fractal_dimension, args=subset_9t7)
processes.append(target=fractal_dimension, args=subset_9t8)
processes.append(target=fractal_dimension, args=subset_9t9)
for process in processes:
process.start()
print(sum(fracd, 0.000)/len(fracd))
错误代码为:
traceback (most recent call last):
File "C:/Users/qkrgn/PycharmProjects/pythonProject/main.py", line 141, in <module>
processes.append(target=fractal_dimension, args=subset_9t1)
TypeError: append() takes no keyword arguments
我想知道为什么会出现这个错误以及如何修复它。拆分图像来计算分形维数,然后将它们组合起来得到分形维数是否会有任何问题。
发布于 2021-10-10 15:26:27
你应该这样做,而不是你实际在做的事情。
from multiprocessing import Process
# make this change for all the times you tried to append it while using the earlier way.
processes.append(Process(target=fractal_dimension, args=[subset_9t1]))
你正在传递的关键字参数对于append函数来说是不存在的,这是你不想做的。
此外,您可以使用for循环,而不是手动输入这些append
if __name__ == '__main__':
VARIABLE_NAME = "subset_9t"
for i in range(1, 10):
p = Process(target=fractal_dimension, args=[eval(VARIABLE_NAME + str(i))])
processes.append(p)
https://stackoverflow.com/questions/69516472
复制相似问题