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

时间:2016-08-22 18:09:42

标签: matlab computer-vision image-segmentation watershed

我试图让分水岭算法正确处理我的图像时遇到了很多麻烦。在网上的各种教程中,他们似乎总是使用同样复杂/模糊的图像,因此我不确定我的错误。我已经就此发了几个帖子,但是想要真正澄清并一般地问。也就是说,我使用的图片如下:

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

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

它似乎永远不会起作用。无论出于何种原因,它确定每个单元格包含一堆较小的单元格: enter image description here

我试图通过使用BW = bwdist(BW) <= 3;聚集分段组件来解决这个问题,以便图像不会碎片化:

enter image description here

如第一张图片中所示,应该有3个细胞,虽然分水岭确实识别出左侧的两个不同的细胞 - 它的注册量超过应有的水平(即使在丛生之后)。 在我尝试过的所有事情之后,我没有取得多大进展,所以任何帮助或建议都会非常感激。

在完成整个分水岭程序后,我最终得到了最大值:

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

  1. 小闭合,以减少噪音。
  2. (可选)小开口以使细胞轮辋正常化。
  3. 侵蚀。侵蚀的结果是你内在的标记。
  4. 扩张。扩张的结果是你的外在标记。
  5. 步骤1后得到的图像的渐变(如果你做了,则为2)。
  6. 使用标记(步骤3和4)在梯度图像上分水(步骤5)。
  7. 但是在这种定义明确的细胞的情况下,我会简单地执行第1步和第2步,然后使用顶帽。它会更有效,更快。