Arrays 在Julia中如何在2D数组中实现泛洪填充? 问题
假设我有一个2D矩阵,其中一些随机整数是Arrays 在Julia中如何在2D数组中实现泛洪填充? 问题,arrays,julia,flood-fill,Arrays,Julia,Flood Fill,假设我有一个2D矩阵,其中一些随机整数是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 我想在右上角的1s区域填充类似8的内容。我如何实现这一点?我知道该地区任何1的索引,并且我有任何1s的索引 填充8s后,数组应如下所示: 1 0 8 8 8 8 0 0 0
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
我想在右上角的1
s区域填充类似8
的内容。我如何实现这一点?我知道该地区任何1
的索引,并且我有任何1
s的索引
填充8
s后,数组应如下所示:
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
s替换为1
s。甚至区域外的8
s也被转换为1
s8
- 使用相对坐标,检查
s,并将初始索引替换为1
s。简而言之,将值为8
的所有邻居替换为1
。这也不起作用,因为它只替换了最近的8个邻居,并没有像我希望的那样填充该区域8
- 瞧!答案在于递归:
该函数将数组中的
arr
,以及以元组(x,y)
形式知道的1
的坐标(或索引)作为参数
使用相对坐标时,我们对每个坐标调用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