【发布时间】: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) <= 3; 聚集在一起来解决这个问题,这样图像就不会被碎片化:
如第一张图片所示,应该有 3 个单元格,虽然分水岭确实识别出左侧的两个不同单元格 - 它记录的数量超出了应有的范围(即使在结块之后)。 在我尝试了一切之后,我没有取得太大的进步,所以任何帮助或建议都会非常感激。
经过完整的分水岭程序后,我最终得到如下最大值:
【问题讨论】:
标签: matlab computer-vision image-segmentation watershed