实现图像扩张和侵蚀

时间:2014-12-03 19:25:49

标签: image-processing mathematical-morphology

我试图找出一种有效的方法来实现图像扩张和二值图像的侵蚀。据我了解,天真的方式是:

  • 循环播放图片
  • 如果像素为1
  • 基于结构元素循环遍历邻域 高度和宽度
  • (扩张)用图中的值替换图像的每个像素 相应的SE位置
  • (erode)检查所有邻域是否等于SE,如果是,请保留所有邻域 像素,否则删除中心

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

有更优雅的方式吗?

1 个答案:

答案 0 :(得分:0)

是的,有!!!

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

现在对于侵蚀/扩张部分,您有不同的解决方案:

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

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