如何将切片数组另存为.png文件?

时间:2019-02-10 10:49:00

标签: dask

我正在运行一个机器学习管道,用于分割非常大的3D图像。我想将结果(dask数组)存储为.png文件,每个文件对应于dask数组的一个切片。您对如何实现这一点有什么建议吗?

我一直试图通过使用joblib dask并行后端构建一个并行的for循环,然后逐个循环遍历结果来保存结果。在直到没有任何明显原因(没有内存问题,没有太多打开的文件描述符等)的管道卡住的某个点之前,这都可以正常工作。

array_to_save已通过client.persist()保留在内存中

with joblib.parallel_backend('dask'):
    joblib.Parallel(verbose=100)(joblib.delayed(png_sav)(j, stack_height, client.compute(array_to_save[j])) for j in range(stack_height))

def png_sav(j, stack_height, prediction):

    img = Image.fromarray(prediction.result().astype('uint32'), 'I') # I to save as 16 bit binary image
    img.save(png_pn+str(j)+'_slice_prediction.png', "PNG")
    img.close()

2 个答案:

答案 0 :(得分:0)

您可以考虑使用其中一种...

  1. map_blocks方法在数据的每个块上调用一个函数。如果您想知道函数在堆栈中的位置,则可以使用block_info=关键字参数。

  2. 将阵列转换为延迟阵列的列表。也许是这样(未经测试,您应该在这里阅读文档)

    x = x.rechunk((1, None, None))  # many chunks along the first axis
    slices = x.to_delayed().flatten()
    saves = [dask.delayed(numpy_array_to_png)(slc, filename='...') for slc in slices]
    dask.compute(*saves)
    
  3. 使用dask-image项目签入。我怀疑他们有东西https://github.com/dask/dask-image

答案 1 :(得分:0)

非常感谢您的提示。 我试图了解如何使用.map_blocks(),尤其是block_info =。但是我不明白如何使用block_info给出的信息。我想分别保存每个块,但不知道该怎么做。有什么提示吗?非常感谢!

da.map_blocks(png_sav(stack_height, prediction, 
                  block_info=True), dtype='uint16')

def png_sav(stack_height, prediction, block_info=True):

    # I don't get how I can save each chunk separately
    img = Image.fromarray("prediction_chunk".astype('uint32'), 'I') # I to save as 16 bit binary image
    img.save(png_pn+str(j)+'_slice_prediction.png', "PNG")
    img.close()