自适应灰度膨胀实现

Adaptive grayscale dilation implementation

给定一个值从 0 到 n 的二维数组,我想根据每个像素包含的值扩大每个像素,较高的值应该在扩大期间覆盖较低的值。

也就是说,半径等于一个像素值的任何像素,如果它们的值较小,则继承​​该值。例如,如果输入是 [0 1 0 2 0 0],输出将是 [1 2 2 2 2 2 ].

如何实现?

您的口头描述正是您将如何实现该算法:对于每个像素(我们称其值为 r),检查其邻域,邻域的大小由 r 给出。在此邻域内,如果所有像素的值较低,则将其设置为 r。你确实需要写入一个独立的输出图像,你不能在不破坏逻辑的情况下修改输入。

这当然是通过一组嵌套循环实现的:首先循环遍历图像中的每个像素,然后在该循​​环中循环遍历邻域中的每个像素。

Python 循环很慢,所以写成 Python 时效率不高。您可以尝试使用 numba 来加快速度。如果足够重要,请用 C 或 C++ 等母语编写。


如果 n 很小,与使用阈值分解的明显实现相比,此操作可能会加快一点。

我们的想法是循环遍历图像中的灰度值 r。在每次迭代中,用大小为 r 的 SE 扩大二值图像 img==r(对于值为 r 的像素为真,其他地方为假)。接下来,通过在扩展图像中获取元素方面的最大值来组成最终输出图像。请注意,您可以在循环中逐步累加最终结果,取前一个结果的最大值和新的扩张。

此实现做了更多工作,但由于您使用的是整幅图像操作,因此可以最大限度地减少 Python 循环的数量,因此(希望)加快代码速度。