流域连通物的图像分割

时间:2013-10-15 15:33:34

标签: python image-processing scipy watershed

我正在尝试分离连接的对象。似乎Python和分水岭算法(scipy实现)非常适合处理这个问题。

这是我的图像和自动生成的分水岭种子点(阈值和距离变换图像的局部最大值):

seeds = myGenSeeds( image_grey )

enter image description here

到目前为止,这么好;每个物体都有种子。

当我进入分水岭时,事情就崩溃了:

segmented = ndimage.measurements.watershed_ift( 255 - image_grey, seeds)`

enter image description here

中上层群集和中心群集分离得很差。在顶部群集中,一个对象充斥着另外两个对象。在中心星团中,虽然它可能太小而无法看到,但是中心种子只能淹没到几个像素。

我有两个问题:

  1. 分水岭算法是否是分离这类物体的不错选择?
  2. 如果是这样,我是否进行了某些预处理以使图像更适合分水岭分割?

3 个答案:

答案 0 :(得分:1)

我找到了这个帖子,因为watershed_ift遇到了同样的问题。我建议您只使用watershed中的skimage.morphology功能。它接受浮动输入,因此你不会失去灰度图像的分辨率,它实际上会泛滥整个盆地,而ift方法似乎只会淹没标记所在的等值线。

修改 一定要将你的距离变换乘以-1,这样峰值就会变成山谷,否则你就不会得到任何分水岭!

答案 1 :(得分:0)

分水岭算法是一种简单而强大的分割算法。您的数据似乎可以用于那种分段算法。据我所知,不需要特殊的预处理。当然,你已经看到了自己,以至于它有点濒临边缘。

经常使用分水岭,但不会考虑您想要识别的对象的任何特殊知识。通过这种方式,可能会有更复杂的算法。

也可能有更复杂的分水岭算法版本。这个名为Watershed 2.0的Python模块有参数(与scipy版本不同)。我会稍微调整一下参数,看看是否可以改进结果。

Ilastik是一种常用于自动细分的工具。它结合了半自动学习(基本上你通过举例来训练它,并从中学习重要的功能)。

答案 2 :(得分:0)

您应该在距离变换步骤之后应用多级阈值处理方法。在将距离转换图像转换为灰度图像之后,对象的中心将在得到的灰度图像中具有最高像素值。在这里,您可以找到从阈值的最高值开始的对象的中心。看看这篇论文https://www.researchgate.net/publication/303703322_A_Multi-level_Thresholding_Based_Segmentation_Method_for_Microscopic_Fluorescence_In_Situ_Hybridization_FISH_Images