6

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

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

seeds = myGenSeeds( image_grey )

在此处输入图像描述

到目前为止,一切都很好; 每个对象都有一个种子。

但是,当我运行分水岭时,事情就崩溃了:

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

在此处输入图像描述

中上层簇和中心簇都分离得很差。在顶部集群中,一个物体淹没在另外两个周围。在中心集群中,虽然它可能太小而无法在这里看到,但中心种子只能泛滥到几个像素。

我有两个问题:

  1. 分水岭算法是这样分离对象的好选择吗?
  2. 如果是这样,我是否需要进行某种预处理以使图像更适合分水岭分割?
4

3 回答 3

2

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

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

于 2017-06-17T17:07:48.800 回答
1

分水岭算法是一种简单而鲁棒的分割算法。对于这种分割算法,您的数据似乎没问题。据我所知,不需要特殊的预处理。当然,您已经看到自己,万一它有点濒临灭绝。

分水岭经常被使用,但不考虑任何关于您要识别的对象的特殊知识。这样,可能会有更复杂的算法可用。

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

Ilastik是一个经常用于自动分割的工具。它结合了半自动学习(基本上你通过给出例子来训练它,并从中学习重要的特征)。

于 2016-03-15T11:47:56.270 回答
0

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

于 2017-01-22T14:51:48.133 回答