如何在 Julia 中实现 flood 填充二维数组?
How does one implement flood fill in a 2D array in Julia?
问题
假设我有一个二维矩阵,其中一些随机整数是 0
或 1
。如何在我的数组中填充连续区域?
该算法特别适用于图像处理,可以像油漆桶工具一样在封闭区域用另一种颜色填充一种颜色。
例子
假设我的数组是:
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
之类的东西填充右上角的 1
s 区域。我该如何实施?我知道该地区任何 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
我的努力:
我试过以下方法:
- 遍历数组中的每一项,检查它是否是
1
,将其替换为 8
。显然这不起作用,因为它只是用 8
替换了所有 1
。甚至区域外的 1
s 也被转换为 8
s.
- 使用相对坐标,检查
1
s,并用 8
s 替换我们给出的初始索引。简而言之,将所有值为 1
的邻居替换为 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
问题
假设我有一个二维矩阵,其中一些随机整数是 0
或 1
。如何在我的数组中填充连续区域?
该算法特别适用于图像处理,可以像油漆桶工具一样在封闭区域用另一种颜色填充一种颜色。
例子
假设我的数组是:
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
之类的东西填充右上角的 1
s 区域。我该如何实施?我知道该地区任何 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
我的努力:
我试过以下方法:
- 遍历数组中的每一项,检查它是否是
1
,将其替换为8
。显然这不起作用,因为它只是用8
替换了所有1
。甚至区域外的1
s 也被转换为8
s. - 使用相对坐标,检查
1
s,并用8
s 替换我们给出的初始索引。简而言之,将所有值为1
的邻居替换为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