0

给定一个值从 0 到 的 2D 数组n,我想通过每个像素包含的值来扩展每个像素,较高的值应该在扩张期间覆盖较低的值。

也就是说,半径内与像素值相等的任何像素,如果它们的值较小,则继承​​该值。例如,如果输入为[0 1 0 2 0 0],则输出为[1 2 2 2 2 2 ]

这怎么可能实现?

4

1 回答 1

1

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

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

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


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

这个想法是你循环r图像中的灰度值。在每次迭代中,使用大小为 的 SE 扩展二值图像img==r(对于值为 的像素为真,在r其他地方为假)r。接下来,通过在膨胀图像中取元素最大值来合成最终的输出图像。请注意,您可以在循环中逐步累积此最终结果,取先前结果的最大值和新的膨胀。

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

于 2020-03-08T00:28:22.980 回答