如何最好地应用`skimage.util.apply_parallel`删除大型数据集中的小对象?

2024-05-16 00:15:30 发布

您现在位置:Python中文网/ 问答频道 /正文

对于study where I'm processing a fairly large cohort of tomographically scanned teeth,我想实现一个裁剪函数,从周围环境中提取每个牙齿。 为此,我使用了scipy.ndimage.find_objects(thresholded_data)[0],并遵循documentation中概述的内容

为了从完整的数据集中可靠地提取牙齿,我需要在使用find_object提取牙齿之前从阈值数据中删除小对象。 我是通过努力做到这一点的

def cropper(image, threshold=66):
  thresholded = image > threshold
  despeckled = skimage.morphology.remove_small_objects(thresholded, min_size=500)
  cropdimensions = scipy.ndimage.find_objects(despeckled)[0]
  return(image[cropdimensions])

我的数据集非常大(每个数据集的大小约为4000 x 1632 x 1632体素),我使用dask在磁盘上存储完整数据集的表示。 因此,为了使上述功能正常工作,我必须在开始时故意使用.compute()将完整的数据集加载到RAM中。 我认为我应该能够应用skimage.util.apply_parallel函数来加快处理速度(并使其能够在内存不足196 GB的机器上运行,幸运的是,我拥有了这台机器)

如果我正确地阅读了文档,似乎我可以“简单地”扩展我的函数并使用下面的代码

def cropper(image, threshold=66):
    thresholded = image > threshold
    despeckled = skimage.util.apply_parallel(skimage.morphology.remove_small_objects,
                                             thresholded,
                                             extra_keywords={'min_size': 500})
    cropdimensions = skimage.util.apply_parallel(scipy.ndimage.find_objects,
                                                 thresholded)
    cropdimensions = cropdimensions[0]
    return(image[cropdimensions])

但是我得到一个{}那是一个{}。 如果我移除find_objects,我可以像这样取出去除斑点的图像

def cropper(image, threshold=66):
    thresholded = image > threshold
    despeckled = skimage.util.apply_parallel(skimage.morphology.remove_small_objects,
                                             thresholded,
                                             extra_keywords={'min_size': 500})
    return(despeckled)

我不能在同一个函数中使用两个连续的apply_parallel


Tags: 数据函数imagethresholdobjectsparallelutilscipy
1条回答
网友
1楼 · 发布于 2024-05-16 00:15:30

经过一段时间的调试;显然,您不能,因为您不是使用skimage来查找对象! 如果您将相关行更改为cropdimensions = scipy.ndimage.find_objects(despeckled)[0],它将按预期工作,您真傻

相关问题 更多 >