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

问题描述

对于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 RAM的计算机上运行)。

如果我阅读了文档说明,似乎可以“简单地”扩展我的功能并使用下面的代码。

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])

但是我得到AttributeError'list' object has no attribute 'dtype'。 如果删除find_objects,我可以像这样去除散斑的图像

def cropper(image,extra_keywords={'min_size': 500})
    return(despeckled)

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

解决方法

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...