现在,我正在尝试使用skimage.filters.threshold_multiotsu方法将n个点过滤成k个组。为了找到分割组的阈值,我正在做
arr=np.asarray([93,86,164,234,310,384,461,538,610,167,245,311,394,470,544,620])
thresholds = threshold_multiotsu(arr,classes=8,nbins=32)即使在等待了一分钟之后,这最终也不会加载。有人想办法解决这个问题吗?
发布于 2020-09-30 01:41:07
尽管编写threshold_multiotsu具有指定任意数量的类的能力,但如果您查看文档中的Notes部分,它将指定复杂度随类数呈指数增长。以下是我对2、3和4个类的计时结果:
In [6]: %timeit threshold_multiotsu(arr, classes=2, nbins=32)
174 µs ± 1.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [7]: %timeit threshold_multiotsu(arr, classes=3, nbins=32)
5 ms ± 98.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [8]: %timeit threshold_multiotsu(arr, classes=4, nbins=32)
873 ms ± 10.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)这是留给读者的一个练习,那就是对这三个点进行指数拟合,并计算出classes=8的值,但是如果我们每次大约增加100倍,我就可以得到超过1100天的运行时间。(classes=5还在为我奔波。)
换句话说,threshold_multiotsu是一个错误的工具,如果是k>4的话。我可能会为您试图做的事情提供一个像金丝这样的算法。
发布于 2022-06-01 16:12:08
在三维阵列图像上,使用7个类的skimage.filters.threshold_multiotsu进行otsu阈值分割需要很长的时间。
大幅度减少时间的一个可能的解决办法是对垃圾箱的数量采取行动。默认情况下,该算法要求256个回收箱(即一般灰度图像的默认值)。你可以降低到一个较粗的数字(例如128)。
例如,我在3D阵列图像上运行了带有7个类和128个桶的threshold_multiotsu,即尺寸为182x182x218 (磁共振成像分析的标准模板)的1mm分辨率的MNI152 T1-w模板。在我的桌面计算机上,经过的时间大约是3分钟。
原始MNI T1-w模板

基于OTSU方法的7天平分割结果

https://stackoverflow.com/questions/64109555
复制相似问题