我正在尝试分离连接的对象。似乎Python和分水岭算法(scipy实现)非常适合处理这个问题。
这是我的图像和自动生成的分水岭种子点(阈值和距离变换图像的局部最大值):
seeds = myGenSeeds( image_grey )
到目前为止,这么好;每个物体都有种子。
当我进入分水岭时,事情就崩溃了:
segmented = ndimage.measurements.watershed_ift( 255 - image_grey, seeds)`
中上层群集和中心群集分离得很差。在顶部群集中,一个对象充斥着另外两个对象。在中心星团中,虽然它可能太小而无法看到,但是中心种子只能淹没到几个像素。
我有两个问题:
答案 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