【问题标题】:Implementation of image dilation and erosion图像膨胀和腐蚀的实现
【发布时间】:2014-12-03 19:25:49
【问题描述】:

我正在尝试找出一种有效的方法来实现二进制图像的图像膨胀和腐蚀。据我了解,天真的方法是:

  • 循环浏览图片
  • 如果像素为 1
  • 根据结构元素的邻域循环 高度和宽度
  • (扩张)将图像的每个像素替换为 SE的对应位置
  • (侵蚀)检查所有邻域是否等于 SE,如果是,则保留所有 像素,否则删除中心

所以这意味着对于每个像素我必须循环通过 SE 以及使其成为 O(NMW*H)。

有没有更优雅的方式来做到这一点?

【问题讨论】:

  • 如果您的图像有大背景,我的一个想法是从不重叠的邻域开始,因为只有在存在0 像素时才会发生膨胀,然后只有在 @ 时才会移动到重叠的邻域在邻域中检测到 987654323@ 个像素。事实上,侵蚀/扩张过滤器比大多数其他图像处理过滤器要快得多,因为它们不需要任何数学运算(例如模糊处理)。
  • 可以的。我也读过关于转移和使用逻辑操作的文章,但我从未真正找到任何详细的内容。我的理解是,可以通过在基于 SE 的方向上复制和移动图像并与所有图像执行 AND 来完成扩张
  • 我刚刚注意到一个类似的问题:stackoverflow.com/questions/21854594/…。一种简单的方法是先执行一维垂直扩张,然后执行一维水平扩张,但一个答案描述了一种更有效的解决方案。

标签: image-processing mathematical-morphology


【解决方案1】:

有!!!

首先,您希望将您的结构元素分解(如果可能)成段(一个由垂直段和水平段组成的正方形)。然后你只对段执行腐蚀/膨胀,这已经降低了复杂性。

现在对于腐蚀/膨胀部分,您有不同的解决方案:

  • 如果您只处理 8 位图像而不使用 C/C++,则使用直方图实现来跟踪最小/最大值。看到这个了不起的工作here。他甚至添加了“地标”以减少操作次数。
  • 如果您使用 C/C++ 并处理不同类型的图像编码,则可以使用快速比较(SSE2、SSE4 和自动矢量化),就像 SMIL library 中的情况一样。在这种情况下,您可以使用材料加速来逐行比较,而不是逐个像素地工作。它似乎是有史以来最快的库。
  • 最后一种方法是使用 Lemmonier 算法,虽然速度较慢,但​​适用于所有类型的编码。它由fulguro library 实现。

对于磁盘类型的结构元素,没有什么“快速”,你必须使用基本算法。对于六边形结构元素,可以逐行处理,但不能并行化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多