给定一个值从 0 到 的 2D 数组n
,我想通过每个像素包含的值来扩展每个像素,较高的值应该在扩张期间覆盖较低的值。
也就是说,半径内与像素值相等的任何像素,如果它们的值较小,则继承该值。例如,如果输入为[0 1 0 2 0 0]
,则输出为[1 2 2 2 2 2 ]
。
这怎么可能实现?
给定一个值从 0 到 的 2D 数组n
,我想通过每个像素包含的值来扩展每个像素,较高的值应该在扩张期间覆盖较低的值。
也就是说,半径内与像素值相等的任何像素,如果它们的值较小,则继承该值。例如,如果输入为[0 1 0 2 0 0]
,则输出为[1 2 2 2 2 2 ]
。
这怎么可能实现?
您的口头描述正是您将如何实现该算法:对于每个像素(我们称之为它的值r
),检查它的邻域,邻域的大小由 给出r
。在这个邻域内,r
如果它们的值较低,则将所有像素设置为。您确实需要写入独立的输出图像,您无法在不破坏逻辑的情况下修改输入。
这当然是通过一组嵌套循环实现的:首先循环图像中的每个像素,然后在这个循环中循环邻域中的每个像素。
Python 的循环很慢,所以用 Python 编写时效率不高。您可以尝试使用numba来加快速度。如果足够重要,请用 C 或 C++ 等本地语言编写。
有可能,如果n
很小,则与使用阈值分解的明显实现相比,此操作可能会加快一点。
这个想法是你循环r
图像中的灰度值。在每次迭代中,使用大小为 的 SE 扩展二值图像img==r
(对于值为 的像素为真,在r
其他地方为假)r
。接下来,通过在膨胀图像中取元素最大值来合成最终的输出图像。请注意,您可以在循环中逐步累积此最终结果,取先前结果的最大值和新的膨胀。
这个实现做了更多的工作,但是由于您使用的是全图像操作,因此您可以最大限度地减少 Python 循环的数量,因此(希望)加快代码速度。