如何在 Julia 中实现 flood 填充二维数组?

How does one implement flood fill in a 2D array in Julia?

问题

假设我有一个二维矩阵,其中一些随机整数是 01。如何在我的数组中填充连续区域?

该算法特别适用于图像处理,可以像油漆桶工具一样在封闭区域用另一种颜色填充一种颜色。

例子

假设我的数组是:

1 0 1 1 1 1 0
0 0 1 1 1 1 1
0 0 0 1 1 1 1
0 1 0 0 0 1 1
0 0 0 1 1 1 1

我想用 8 之类的东西填充右上角的 1s 区域。我该如何实施?我知道该地区任何 1 的索引,并且我有 1 中任何一个的索引。

填充8后,数组应该是这样的:

1 0 8 8 8 8 0
0 0 8 8 8 8 8
0 0 0 8 8 8 8
0 1 0 0 0 8 8
0 0 0 8 8 8 8 

我的努力:

我试过以下方法:

瞧!答案在于递归:

该函数将您的数组作为 arr,并将您知道的 1 的坐标(或索引)以元组 (x, y) 的形式作为参数。

当使用相对坐标时,我们在每个坐标上调用 flood_fill 函数:

function flood_fill(arr, (x, y))
    # check every element in the neighborhood of the element at (x, y) in arr
    for x_off in -1:1
        for y_off in -1:1
            # put the next part in a try-catch block so that if any index
            # is outside the array, we move on to the next element.
            try
                # if the element is a 1, change it to an 8 and call flood_fill 
                # on it so it fills it's neighbors
                if arr[x + x_off, y + y_off] == 1
                    arr[x + x_off, y + y_off] = 8
                    flood_fill(arr, (x + x_off, y + y_off))
                end
            catch
                continue
            end
        end
    end
end