0

我用cv2和编写了一个去噪函数concurrent.futures,用于我的训练和测试图像数据。

功能(当前)如下:

def denoise_single_image(img_path):
    nonlocal data
    img = cv2.imread(f'../data/jpeg/{data}/{img_path}')
    dst = cv2.fastNlMeansDenoising(img, 10,10,7,21)
    cv2.imwrite(f'../processed_data/jpeg/{data}/{img_path}', dst)
    print(f'{img_path} denoised.')
 
def denoise(data):
    img_list = os.listdir(f'../data/jpeg/{data}')
    with concurrent.futures.ProcessPoolExecutor() as executor:
        tqdm.tqdm(executor.map(denoise_single_image, img_list))

data必要时为traintestimg_list是该目录中所有图像名称的列表。

需要先创建denoise_single_image()函数denoise(),否则denoise()无法识别;但我需要data在创建之前定义denoise_single_image(). 这似乎是一个 catch-22,除非我能弄清楚如何告诉denoise_single_image()引用存在于上一级的变量。

nonlocal不起作用,因为它假定data已在此环境中定义。有什么办法可以让它工作吗?

4

1 回答 1

0

您可以将可迭代的 in 更改executor.map为参数元组,然后可以将其拆分到您的其他函数中。

executor.map(denoise_single_image, ((img_path, data) for img_path in img_list))

def denoise_single_image(inputs):
    img_path, data = inputs
    # etc

但在你的情况下,我只会像这样修改单个图像路径

executor.map(denoise_single_image, (f'jpeg/{data}/{img_path}' for img_path in img_list))

def denoise_single_image(img_path):
    img = cv2.imread(f'../data/{img_path}')
    dst = cv2.fastNlMeansDenoising(img, 10,10,7,21)
    cv2.imwrite(f'../processed_data/{img_path}', dst)
    print(f'{img_path.split('/')[-1]} denoised.')
于 2021-05-04T19:46:49.103 回答