Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 图像膨胀与腐蚀的实现_Image Processing_Mathematical Morphology - Fatal编程技术网

Image processing 图像膨胀与腐蚀的实现

Image processing 图像膨胀与腐蚀的实现,image-processing,mathematical-morphology,Image Processing,Mathematical Morphology,我试图找出一种有效的方法来实现二值图像的图像膨胀和腐蚀。据我所知,天真的做法是: 循环浏览图像 如果像素为1 根据结构元素的 高度和宽度 (放大)用图像中的值替换图像的每个像素 SE的相应位置 (侵蚀)检查所有邻域是否等于SE,如果是,保留所有 像素,否则删除中心 这意味着对于每个像素,我必须循环通过SE,并使其成为O(NMW*H) 有更优雅的方法吗?有 首先,您希望将结构元素分解(如果可能的话)为段(由垂直段和水平段组成的正方形)。然后只对线段执行侵蚀/膨胀,这已经降低了复杂性 现在,对于

我试图找出一种有效的方法来实现二值图像的图像膨胀和腐蚀。据我所知,天真的做法是:

  • 循环浏览图像
  • 如果像素为1
  • 根据结构元素的 高度和宽度
  • (放大)用图像中的值替换图像的每个像素 SE的相应位置
  • (侵蚀)检查所有邻域是否等于SE,如果是,保留所有 像素,否则删除中心
这意味着对于每个像素,我必须循环通过SE,并使其成为O(NMW*H)

有更优雅的方法吗?

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

现在,对于侵蚀/膨胀零件,您有不同的解决方案:

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

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

如果图像背景较大,我的一个想法是从非重叠邻域开始,因为只有在存在
0
像素的情况下才会发生缩放,然后,仅当在邻域中检测到
0
像素时,才移动到重叠邻域。事实上,腐蚀/扩张过滤器比大多数其他图像处理过滤器要快得多,因为它们不需要任何数学运算(例如,像模糊一样)。这可以做到。我也读过关于移位和使用逻辑运算的书,但我从来没有发现任何细节。我所了解的是,可以通过复制图像并根据SE在方向上移动图像,然后对所有图像执行操作来实现放大。我刚才注意到一个类似的问题:。一种简单的方法是先执行一维垂直膨胀,然后执行一维水平膨胀,但有一个答案描述了一种更有效的解决方案。