自适应灰度膨胀实现
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 循环的数量,因此(希望)加快代码速度。
给定一个值从 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 循环的数量,因此(希望)加快代码速度。