问题描述
对于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]
,它将按预期工作,那么您就傻了!