分水岭算法的过分割

时间:2013-12-16 22:35:31

标签: matlab image-processing image-segmentation watershed

我按照Mathworks.com中的2-D Watershed example分隔连接的对象,如下图所示:

Imgur

代码总结如下:

bw = imread('some_binary_image.tif');

D = -bwdist(~bw);

D(~bw) = -Inf;

L = watershed(D);

结果是:

Imgur

中心的颗粒已分成两部分。有没有办法在这里避免过度细分?

谢谢,lennon310,chessboard对我的大多数图片都有效,但仍有一些情况不适用。例如,以下二进制图像: Imgur

使用棋盘将导致: Imgur

由于我有数百张图像,因此很难找到适合所有图像的参数组合。我想知道我是否需要结合使用棋盘,城市街区等获得的好结果......

2 个答案:

答案 0 :(得分:7)

使用max(abs(x1-x2),abs(y1-y2))作为距离指标(棋盘),并使用watershed函数中的八连接邻域:

bw=im2bw(I);

D = -bwdist(~bw,'chessboard');
imagesc(D)
D(~bw) = -Inf;

L = watershed(D,8);
figure,imagesc(L)

结果: enter image description here

答案 1 :(得分:3)

我一直处理同样的问题。对我来说,解决方案是使用基于标记的分水岭方法。查看Steve在Matlab博客上给出的分水岭方法示例:http://blogs.mathworks.com/steve/ 他给出的这种方法最适合我:http://blogs.mathworks.com/steve/2013/11/19/watershed-transform-question-from-tech-support/

现在,在理想的世界中,我们可以使用单一方法正确分割所有内容。但是无论您使用哪种方法,分水岭都会对某些粒子进行过度分割或过低分割(除非您手动给出标记)。所以,目前我正在使用半自动分割方法;即,使用分水岭尽可能最好地分割图像,然后将该图像带入MSPaint并手动编辑以纠正残留下/过分割的任何内容。

过去,某些人似乎已经开始使用地区。但我的图像处理知识有限,所以我无法帮助你。如果有人可以发布关于如何使用区域增长来分割这样的图像的话,那将是很棒的。

希望这会有所帮助。