【问题标题】:Connected-Component-Labeling-Algorithm fails in some cases连接组件标签算法在某些情况下失败
【发布时间】:2015-04-28 14:40:12
【问题描述】:

我用过这个算法 http://www.codeproject.com/Articles/336915/Connected-Component-Labeling-Algorithm 从噪声中清除图像。 这是原始噪音

这是我得到的:

最终图像周围仍有噪点。 有谁知道算法在哪里失败或可以推荐更有效的算法? 谢谢

【问题讨论】:

  • 从噪声中分离信号是一项经典的非平凡任务。您需要对它(或其他类似算法)有更深入的了解,然后才能针对您手头的任务对其进行优化。您不能期望“完美”的噪声消除,只是“更好”的命中率,例如如果您在优化方面工作足够长且足够努力,则出错的可能性会降低。
  • 据我所知,剩余的噪声仅限于大斑点的凸包内。考虑这个属性(假设它可以被验证)是否会为您的应用程序提供足够的去斑质量。

标签: image algorithm noise


【解决方案1】:

ImageMagick 用最少的努力就做得很好。无论如何,它都安装在大多数 Linux 发行版上,并且可用于 OSX 和 Windows。像这样从命令行运行:

convert input.png                                   \
   -colorspace gray -negate -threshold 10%          \
   -define connected-components:verbose=true        \
   -define connected-components:area-threshold=800  \
   -connected-components 8 -auto-level output.png

输出

Objects (id: bounding-box centroid area mean-color):
  0: 431x424+0+0 209.2,207.5 135697 srgb(13,13,13)
  109: 236x273+120+84 231.7,223.0 47047 srgb(255,255,255)

如果您将阈值更改为仅显示面积大于 50 的斑点,您会得到:

Objects (id: bounding-box centroid area mean-color):
  0: 431x424+0+0 210.2,208.5 134262 srgb(11,11,11)
  109: 236x273+120+84 231.7,223.0 47047 srgb(255,255,255)
  1: 40x20+1+1 16.9,9.5 605 srgb(255,255,255)
  190: 12x15+309+153 314.2,160.1 126 srgb(253,253,253)
  83: 12x13+142+71 148.1,76.7 90 srgb(255,255,255)
  164: 12x17+140+132 146.0,140.1 90 srgb(255,255,255)
  347: 10x12+50+304 54.5,309.6 85 srgb(255,255,255)
  440: 11x11+278+399 282.6,404.2 79 srgb(255,255,255)
  448: 6x15+425+403 427.9,409.9 71 srgb(255,255,255)
  151: 9x11+145+122 149.2,126.4 68 srgb(255,255,255)
  93: 11x9+105+75 110.1,79.6 61 srgb(255,255,255)
  170: 9x10+91+136 95.1,140.8 58 srgb(255,255,255)
  258: 9x10+107+220 110.8,225.1 52 srgb(255,255,255)
  53: 10x8+64+47 68.5,50.2 50 srgb(255,255,255)

或者,如果你想要一些 C 代码,你可以看看我的answer here 这个问题:

【讨论】:

    【解决方案2】:

    提到的算法没有提到噪声清除。该算法将不同的连续区域分开。

    您已决定使用算法来查找和分离主要印迹。为什么不。但看起来,你也发现了几个紧密的小斑点。实际上,您的 prog 似乎将 2 像素距离作为 1 像素实例。原因可能是:

    1. 代码错误——但我几乎无法想象会导致这种情况的错误。只有当你使用一些额外的算法来加快这个过程。或者,如果您通过简单地寻找不同组合的 +1、x、y 的 +1、-1 来寻找邻居(不好的方法!),您可以改为 2。
    2. 真的,这些小污点通过细小的像素序列连接到主要的污点,在您用于显示图片的比例中是不可见的。真的是 1:1 的图像吗?

    【讨论】:

    • 可能代码有一些错误。你能推荐我一些算法来找到和分离主要的印迹吗?
    • 但是算法还不错。真的是 1:1 的图像吗?在寻找邻居时寻找您的 +1-1 变体?但是,如果主印迹看起来像两个分开的宽度为 1 像素的印迹,你该怎么办?我无法建议您使用不了解噪声特征的算法。
    • 第一张图(有噪点)放大,第二张图(无噪点输出)1:1。如果我更改(在 CLL 类中,在函数 GetNeighboringLabels 中)i
    • @MartinaLabMath 有什么奇怪的?您必须检查与 x+-1、y+-1 像素是否相邻。而不是+-2。如果由于您对噪声的理解而将 +-2 点视为相邻点,那么您的结果就是正确的。不要这样比较。将+-1的所有组合放入一个数组中,循环遍历。
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多