正确使用Matlab分水岭算法分割细胞

正确使用Matlab分水岭算法分割细胞,matlab,computer-vision,image-segmentation,watershed,Matlab,Computer Vision,Image Segmentation,Watershed,为了让分水岭算法在我的图像上正常工作,我遇到了很多麻烦。在各种在线教程中,他们似乎总是使用同样复杂/模糊的图像,因此我不确定我的图像有什么问题。我已经在这方面发表了一些零星的帖子,但我想真正澄清一下,并提出一般性的问题。也就是说,我使用的图像如下: 但是,当我尝试应用其中一种分水岭算法时: imshow(RGB,[]); gray_img = rgb2gray(RGB); tophat_filter = imtophat(gray_img, strel('disk', 10)); %Read

为了让分水岭算法在我的图像上正常工作,我遇到了很多麻烦。在各种在线教程中,他们似乎总是使用同样复杂/模糊的图像,因此我不确定我的图像有什么问题。我已经在这方面发表了一些零星的帖子,但我想真正澄清一下,并提出一般性的问题。也就是说,我使用的图像如下:

但是,当我尝试应用其中一种分水岭算法时:

imshow(RGB,[]);

gray_img = rgb2gray(RGB);
tophat_filter = imtophat(gray_img, strel('disk', 10)); %Read into this

level = graythresh(tophat_filter);
BW = im2bw(tophat_filter,level);
imshow(BW)

BW = bwdist(BW) <= 3;

imshow(BW)
bgn_remove = bwareaopen(BW,8); %remove background noise

D = -bwdist(~bgn_remove); %Read into this
D(~BW) = -Inf;
L = watershed(D);

figure;
imshow(L,[]);
figure;
imshow(label2rgb(L))
clean_img = im2bw(L,0.001);

figure;
imshow(clean_img,[]);
imshow(RGB,[]);
gray_img=rgb2gray(RGB);
tophat_filter=imtophat(灰色,'disk',10');%读读这篇文章
级别=灰度阈值(tophat_过滤器);
BW=im2bw(tophat_过滤器,液位);
imshow(BW)

BW=bwdist(BW)必须使用种子/约束/标记分水岭。如果使用经典(不再使用)分水岭,将面临过度分割

在您的情况下,我将使用分水岭执行此经典方法来分割单元:

  • 小关闭,以降低噪音
  • (可选)用于调整单元格边缘的小开口
  • 侵蚀。侵蚀的结果是你内心的标记
  • 扩张。扩张的结果就是你的外部标记
  • 在第1步(或第2步,如果您这样做了)之后生成的图像的渐变
  • 渐变图像上的分水岭(步骤5),使用标记(步骤3和4)

  • 但是在你的例子中,对于定义良好的单元格,我会简单地执行步骤1和2,然后是一顶礼帽。它将同样有效,而且速度更快。

    非常感谢您的帮助。然而,我对这一点非常陌生,有几个问题:对于步骤1,“小闭合”是一种形态闭合吗,如
    imclose
    ?或者更确切地说,用类似于
    bwareaopen
    的方法来减少噪音?对于第2步,是否调整单元格边缘以使其均匀?如果是这样,它与第一步有什么不同?我想我理解第3步和第4步,但我会更深入地研究它们。在步骤5/6中,我不确定如何使用这些特定的标记来预先形成分水岭-似乎与一般情况不同。您是否可以为这些步骤中的某些步骤提供示例代码?1/是的,当BWAREOPEN在黑白图像上打开区域时,inclose会关闭(这里不是您的情况)。2/它只会变成不规则的形状。正如我所说,这是可选的。步骤1将删除所有的灰尘效应主要在细胞的中间,当步骤2之后的步骤1将主要影响轮廓。5/6对于渐变,使用Sobel。对于分水岭,查找种子(也称为约束)版本,然后渐变图像和标记将成为参数的一部分。对不起,我不使用MatLab。太棒了,谢谢。您还提到了使用
    tophat
    ,有什么原因会导致细胞大部分消失?使用步骤1和步骤2后,图像看起来更清晰,我是否可以单独使用分水岭?或者首先使用侵蚀膨胀/或tophat方法更有意义吗?你需要侵蚀和膨胀来计算标记,因为你需要梯度来突出显示单元格边缘。对于顶级帽子,您需要使用一个大的结构元素。一个大到足以抹去细胞的结构元素。好的,非常感谢。我遵循了您的指示,但是我仍然被卡住了——在过程结束时,每个束都被识别为一个。将每一对确定为单个的步骤是:
    fgm=imregionalmax(Iobrcbr)
    ,这是“通过重建打开-关闭(fgm)的区域最大值”。有什么建议我可以降低这个门槛,或者这是一个失败的原因?再次感谢!