我对Flood Fill算法完全不熟悉。我从维基百科(http://en.wikipedia.org/wiki/Flood_fill)查看了它。但没有变得那么明智。我试图在以下情况下使用它。我有一个矩阵:
matrix = [["a", "a", "b", "a", "a", "b"],
["a", "b", "b", "a", "b", "b"],
["b", "a", "b", "a", "a", "b"],
["b", "a", "b", "a", "b", "b"],
["a", "a", "b", "a", "a", "a"],
["a", "b", "b", "a", "a", "b"]]
然后我让用户从矩阵中决定一个点。如果在该给定点是"b"
则没有做任何事情。在另一种情况下,如果在给定点"a"
我希望在洪水填充的帮助下更改该给定点并将所有周围或连接点与"a"
更改为“c”算法
例如,假设用户决定矩阵[0] [0]。然后新矩阵将是:
matrix = [["c", "c", "b", "a", "a", "b"],
["c", "b", "b", "a", "b", "b"],
["b", "a", "b", "a", "a", "b"],
["b", "a", "b", "a", "b", "b"],
["a", "a", "b", "a", "a", "a"],
["a", "b", "b", "a", "a", "b"]]
让我们继续这个例子并说用户决定新点,矩阵[3] [1]。然后我们会:
matrix = [["c", "c", "b", "a", "a", "b"],
["c", "b", "b", "a", "b", "b"],
["b", "c", "b", "a", "a", "b"],
["b", "c", "b", "a", "b", "b"],
["c", "c", "b", "a", "a", "a"],
["c", "b", "b", "a", "a", "b"]]
我正在尝试构建一个函数floodfill(matrix,x,y),到目前为止我已经想到了这个:
def floodfill(matrix, x, y):
if matrix[y][x] == "b":
return matrix
elif matrix[y][x] == ".":
stack = []
你有办法引导我继续吗?试图在这里搜索SOF的洪水填充示例,但它们似乎不适合我的情况。至少我无法将这些示例应用于我的代码。洪水填充似乎不是那里受欢迎的主题......但是,再一次,帮助将受到高度赞赏!
答案 0 :(得分:13)
嗯,洪水填充的想法是:
类似python的伪代码:
def floodfill(matrix, x, y):
#"hidden" stop clause - not reinvoking for "c" or "b", only for "a".
if matrix[x][y] == "a":
matrix[x][y] = "c"
#recursively invoke flood fill on all surrounding cells:
if x > 0:
floodfill(matrix,x-1,y)
if x < len(matrix[y]) - 1:
floodfill(matrix,x+1,y)
if y > 0:
floodfill(matrix,x,y-1)
if y < len(matrix) - 1:
floodfill(matrix,x,y+1)
答案 1 :(得分:0)
在用于Python的图像处理库中,存在泛洪填充算法的几种实现。我知道两个:skimage.segmentation.flood和OpenCV's floodFill。前者是在Python中使用与上述amit答案中的算法相似的算法实现的。后者是使用概念上类似的算法在C ++中实现的,但无需递归,从而使其效率更高(大图像约为25倍)。
要使用OpenCV的FloodFill,您需要将矩阵转换为整数np.array,可以按以下步骤进行操作:
import numpy as np
import cv2
matrix_np = np.asarray(matrix)
numeric_matrix = np.where(matrix_np=="a", 255, 0).astype(np.uint8)
mask = np.zeros(np.asarray(numeric_matrix.shape)+2, dtype=np.uint8)
start_pt = (y,x)
if matrix_np[start_pt]:
cv2.floodFill(numeric_matrix, mask, start_pt, 255, flags=4)
mask = mask[1:-1, 1:-1]
matrix_np[mask==1] = "c"
matrix = matrix_np.tolist()
使用上面给出的示例矩阵和x,y =(0,0),这会将matrix
设置为
[['c', 'c', 'b', 'a', 'a', 'b'],
['c', 'b', 'b', 'a', 'b', 'b'],
['b', 'a', 'b', 'a', 'a', 'b'],
['b', 'a', 'b', 'a', 'b', 'b'],
['a', 'a', 'b', 'a', 'a', 'a'],
['a', 'b', 'b', 'a', 'a', 'b']]