1

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

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

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) <= 3;这样图像就不会被碎片化:

在此处输入图像描述

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

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

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

在您的情况下,我会采用这种经典方法来使用分水岭分割单元格:

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

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

于 2016-08-22T18:21:39.430 回答