我按照Mathworks.com中的2-D Watershed example分隔连接的对象,如下图所示:
代码总结如下:
bw = imread('some_binary_image.tif');
D = -bwdist(~bw);
D(~bw) = -Inf;
L = watershed(D);
结果是:
中心的颗粒已分成两部分。有没有办法在这里避免过度细分?
谢谢,lennon310,chessboard
对我的大多数图片都有效,但仍有一些情况不适用。例如,以下二进制图像:
使用棋盘将导致:
由于我有数百张图像,因此很难找到适合所有图像的参数组合。我想知道我是否需要结合使用棋盘,城市街区等获得的好结果......
答案 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)
结果:
答案 1 :(得分:3)
我一直处理同样的问题。对我来说,解决方案是使用基于标记的分水岭方法。查看Steve在Matlab博客上给出的分水岭方法示例:http://blogs.mathworks.com/steve/ 他给出的这种方法最适合我:http://blogs.mathworks.com/steve/2013/11/19/watershed-transform-question-from-tech-support/
现在,在理想的世界中,我们可以使用单一方法正确分割所有内容。但是无论您使用哪种方法,分水岭都会对某些粒子进行过度分割或过低分割(除非您手动给出标记)。所以,目前我正在使用半自动分割方法;即,使用分水岭尽可能最好地分割图像,然后将该图像带入MSPaint并手动编辑以纠正残留下/过分割的任何内容。
过去,某些人似乎已经开始使用地区。但我的图像处理知识有限,所以我无法帮助你。如果有人可以发布关于如何使用区域增长来分割这样的图像的话,那将是很棒的。
希望这会有所帮助。