分水岭算法的过分分割问题

5

我按照Mathworks.com上的2-D Watershed example来分离连接对象,就像下面的图片:

Imgur

代码总结如下:

bw = imread('some_binary_image.tif');

D = -bwdist(~bw);

D(~bw) = -Inf;

L = watershed(D);

结果是:
中心的粒子已经分成两部分。有没有办法避免这种过分分割的情况?
谢谢,lennon310,“棋盘格”对于我的大多数图像确实有效,但仍有一些情况不行。例如,下面的二进制图像: 使用“棋盘格”将导致: 由于我有数百张图片,似乎很难找到适用于所有图片的参数组合。我想知道是否需要结合使用“棋盘格”、“城市街区”等方法获得良好的结果...

你的数百张图像处理的目的是什么?提取对象时不必使用分水岭算法。由于图像中两个圆之间存在微小的连接,因此基本的标记连通组件的方法也可能无法正常工作。实际上,在Matlab图像处理工具箱中有圆检测器(Hough、imfindcircles等)。 - lennon310
@lennon310:这些实际上是X射线断层扫描成像。我想为我感兴趣的粒子创建一个掩模。目前,我正在使用ImageJ中的Connected Threshold Grower,它可以从种子点找到连接区域。通过在感兴趣的粒子上设置种子点,Connected Threshold Grower可以产生一个仅包含该粒子的结果,如果它没有接触到其他粒子。现在,我手动擦除了成百上千张图像的接触边界,这非常耗时。我正试图使用分水岭来自动分离这些颗粒。 - shapeare
X光图像不是二进制图像,对吧?我认为可以检测到连通组件,甚至可以尝试基于强度差异在原始图像上进行聚类算法。对于二进制图像,特别是您更新后的图像,将两个实际连接的圆分割开来是具有挑战性的。 - lennon310
2个回答

7

watershed函数中使用八连通邻域,并使用max(abs(x1-x2),abs(y1-y2))作为距离度量(国际象棋棋盘距离):

bw=im2bw(I);

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

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

结果: 这里输入图片描述

3
我一直在处理同样的问题。对我来说,解决方案是使用基于标记的分水岭方法。可以在Steve的Matlab博客上查找分水岭方法的示例:http://blogs.mathworks.com/steve/ 。他提供的这种方法对我最有效:http://blogs.mathworks.com/steve/2013/11/19/watershed-transform-question-from-tech-support/ 理想情况下,我们将能够使用单个方法正确地分割所有内容。但无论使用哪种方法(除非手动给出标记),分水岭都会过度或欠分割某些颗粒。因此,目前我正在使用半自动分割方法;即使用分水岭尽可能好地分割图像,然后将该图像导入MSPaint并手动编辑以纠正任何欠分割或过度分割。
一些人似乎过去使用了区域增长。但我的图像处理知识有限,所以无法帮助您解决问题。如果有人能发布有关如何使用区域增长分割此类图像的信息,那将是很好的。
希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接