像threshold_otsu或者threshold_li等方法得到的阈值就是一个数值,然后得应用到全局。但如果一张比较大的图像,特别是三维数据中各处的背景不太均匀的时候,直接使用一个数值来进行全局的阈值分割很难做好。所以掌握局部阈值计算方法是很必要的。
如上图所示, scikit-image官方文档给出了全局阈值和局部阈值的区别。
其实要获取局部阈值,可以使用 skimage.filters.threshold_local
函数。这个函数主要得控制的参数,一个是block_size,这个决定了局部的大小,而且必须得是奇数。另外一个是 offset,因为通过默认的guassian方法(对邻域像素进行高斯加权平均,越靠近中心像素的权重越大)计算出来的原始threshold通常都要进行一些偏移,才能得到合适的效果。这个是需要自行调节参数尝试的(经典方法就是这样,由于要不断调参以适应质量参差不齐的数据,就会相当繁琐)。
通过查看 threshold_local 的返回值,可以知道它实际上也是一张图像:
而且看上去是被一个高斯核卷积过的图像。如果想对这个高斯核进行调节,文档里说可以设置threshold_local里的param参数。接下来利用这个阈值做下二值化看看效果。
如上图所示,threshold_local 和 threshold_li 分别确定局部阈值和全局阈值,再对原图进行二值化之后的效果都能够比较好。threshold_li 速度更快,threshold_local 更能适应复杂情况。