对于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
吗
经过一段时间的调试;显然,您不能,因为您不是使用
skimage
来查找对象! 如果您将相关行更改为cropdimensions = scipy.ndimage.find_objects(despeckled)[0]
,它将按预期工作,您真傻相关问题 更多 >
编程相关推荐