【问题标题】:Over-segmentation of Watershed algorithm分水岭算法的过分割
【发布时间】:2013-12-16 22:35:31
【问题描述】:

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

代码总结为:

bw = imread('some_binary_image.tif');

D = -bwdist(~bw);

D(~bw) = -Inf;

L = watershed(D);

结果是:

中心的粒子已被分成两部分。有什么办法可以避免这里的过度分割?

谢谢,lennon310,chessboard 确实适用于我的大多数图像,但仍有一些情况不适用。例如,下面的二进制图像:

使用棋盘将导致:

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

【问题讨论】:

  • 您处理数百个图像的目的是什么?没有必要使用分水岭来提取对象。由于图像中的两个圆圈之间存在微小的连接,因此标记连接组件的基本方法也可能不起作用。其实matlab图像处理工具箱里有圆形检测器(hough, imfindcircles, ...)。
  • @lennon310 :这些实际上是 X 射线断层扫描拍摄的图像。我想为我感兴趣的粒子创建一个蒙版。目前,我在 ImageJ 中使用 Connected Threshold Grower,它可以从种子点找到连接区域。通过在感兴趣的粒子上设置种子点,Connected Threshold Grower 可以生成仅包含该粒子的结果,前提是它不接触其他粒子。现在我手动擦除数百张图像的接触边界,这很耗时。我正在尝试使用分水岭来自动分离这些粒子。
  • X 射线图像不是二值图像,是吗?我认为可以检测到连通分量,甚至可以根据强度差异对原始图像进行聚类算法尝试。对于二值图像,尤其是您更新的图像,分割两个实际连接的圆圈是一项挑战。

标签: matlab image-processing image-segmentation watershed


【解决方案1】:

使用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)

结果:

【讨论】:

    【解决方案2】:

    我处理同样的问题已经有一段时间了。对我来说,解决方案是改用基于标记的分水岭方法。寻找史蒂夫在 Matlab 博客上给出的分水岭方法示例:http://blogs.mathworks.com/steve/ 他给出的这个方法最适合我:http://blogs.mathworks.com/steve/2013/11/19/watershed-transform-question-from-tech-support/

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

    过去似乎有人使用区域增长。但是我的图像处理知识有限,所以我无法帮助您。如果有人能发布一些关于如何使用区域增长来分割这样的图像的东西,那就太好了。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 2012-07-11
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 2011-09-08
      相关资源
      最近更新 更多