【问题标题】:Properly using Matlab Watershed Algorithm to segment cells正确使用 Matlab 分水岭算法分割细胞
【发布时间】:2016-12-29 09:22:35
【问题描述】:

我在尝试让分水岭算法正确处理我的图像时遇到了很多麻烦。在各种在线教程中,他们似乎总是使用同样复杂/模糊的图像,所以我不确定我的有什么问题。我已经对此发表了一些参差不齐的帖子,但想真正澄清并提出一般性问题。也就是说,我使用的图像如下:

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

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,[]);

它似乎永远不会工作。无论出于何种原因,它都确定每个单元格由一堆较小的单元格组成:

我试图通过将分段组件与BW = bwdist(BW) &lt;= 3; 聚集在一起来解决这个问题,这样图像就不会被碎片化:

如第一张图片所示,应该有 3 个单元格,虽然分水岭确实识别出左侧的两个不同单元格 - 它记录的数量超出了应有的范围(即使在结块之后)。 在我尝试了一切之后,我没有取得太大的进步,所以任何帮助或建议都会非常感激。

经过完整的分水岭程序后,我最终得到如下最大值:

【问题讨论】:

    标签: matlab computer-vision image-segmentation watershed


    【解决方案1】:

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

    在你的情况下,我会用这种经典的方法来使用分水岭来分割细胞:

    1. 小关闭以减少噪音。
    2. (可选)用于调整电池边缘的小开口。
    3. 侵蚀。侵蚀的结果就是你的内在标记。
    4. 扩张。膨胀的结果就是你的外部标记。
    5. 第 1 步(如果您执行了第 2 步)后生成的图像的渐变。
    6. 渐变图像上的分水岭(步骤 5),使用标记(步骤 3 和 4)。

    但是在你的情况下,如果单元格定义如此明确,我会简单地执行第 1 步和第 2 步,然后是大礼帽。它将同样有效且速度更快。

    【讨论】:

    • 非常感谢您的帮助。但是,我对此很陌生并且有几个问题:对于第 1 步,“小关闭”是像 imclose 这样的形态关闭吗?或者更确切地说,使用类似bwareaopen 的东西来减少噪音?对于第 2 步,是否正则化单元边缘以使其均匀?如果是这样,它与第 1 步有何不同?我想我理解第 3 步和第 4 步,但我会更多地研究它们。在步骤 5/6 上,我不确定如何使用这些特定标记来预置分水岭——似乎与一般情况不同。无论如何,您可以为其中一些步骤提供示例代码吗?
    • 1/ 是的,当 bwareaopen 在黑白图像上打开一个区域时,inclose 会关闭(这里不是你的情况)。 2/ 它只是不规则的形状。正如我所说,它是可选的。步骤 1 将主要删除单元格中间的所有灰尘效果,而步骤 1 之后的步骤 2 将主要影响轮廓。 5/6 对于渐变,使用 Sobel。对于分水岭,寻找种子(也称为约束)版本,然后梯度图像和标记将成为参数的一部分。抱歉,我不使用 MatLab。
    • 太棒了,谢谢。您还提到使用tophat,是否有任何原因会导致细胞大部分消失?使用第 1 步和第 2 步后,图像看起来更清晰了,我可以单独使用分水岭吗?还是先使用腐蚀膨胀/或 tophat 方法更有意义?
    • 您需要腐蚀和膨胀来计算标记,因为您需要渐变才能突出显示单元格边缘。对于 Top-Hat,您需要使用 BIG 结构元素。一个足以擦除单元格的结构元素。
    • 好的,非常感谢。我按照您的指示以及mathworks.com/help/images/examples/… 进行操作,但我仍然卡住了——在该过程结束时,每个丛都被识别为一个。将每对确定为单对的步骤是:fgm = imregionalmax(Iobrcbr),即“重建开闭的区域最大值 (fgm)”。有什么建议可以降低这个门槛,还是这种失败的原因?再次感谢!
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多