2

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

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

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

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

4

1 回答 1

0

是的,有!!!

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

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

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

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

于 2015-12-28T23:34:29.310 回答