停止 Floodfill 算法

Stopping Floodfill algorithm

我受困于我的洪水填充算法:它在 "normally" 不应该...

的那一刻停止

情况如下:我有一个 512*512 像素的矩阵,其值是 50 或 100 左右。 50 的值正在形成一个正方形,我想将其更改为一个值为 255 的正方形(使用 floodfill 算法)。

def FF(matrix,x,y,h):     #h is chosen <=50

    stack=[]
    matrix[x,y]=255

    stack.append((x,y))

    while stack!=[]:

        (x,y)=stack[0]

        stack.pop()


        if matrix[x-1,y] <= h:          #Pixel North
            matrix[x-1,y]=255
            stack.append((x-1,y))

        if matrix[x,y+1] <= h:          #Pixel East
           matrix[x,y+1]=255
           stack.append((x,y+1))

        if matrix[x+1,y] <= h:          #Pixel South
           matrix[x+1,y]=255
           stack.append((x+1,y))

        if matrix[x,y-1] <= h:          #Pixel West
           matrix[x,y-1]=255
           stack.append((x,y-1))

        if matrix[x-1,y+1] <= h:        #Pixel North East
           matrix[x-1,y+1]=255
           stack.append((x-1,y+1))

        if matrix[x+1,y+1] <= h:        #Pixel South East
           matrix[x+1,y+1]=255
           stack.append((x+1,y+1))

        if matrix[x+1,y-1] <= h:        #Pixel South West
           matrix[x+1,y-1]=255
           stack.append((x+1,y-1))

        if matrix[x-1,y-1] <= h:        #Pixel North West
           matrix[x-1,y-1]=255
           stack.append((x-1,y-1))

    else:
       print ('... finished')
       return

我不知道为什么,但代码运行了 10 次,但不会更多。

谢谢Q

问题出在这里:

    (x,y)=stack[0] # get the first element of the list
    stack.pop() # remove the *last* element

由于您获得了第一个元素,但删除了最后一个元素,因此有可能(就像并且可能总是这样),不会 将评估所有被推送的元素在堆栈上。

尽管如此,您还是太复杂了。简单地写:

def FF(matrix,x,y,h):     #h is chosen <=50
    stack=[(x,y)]
    m,n = matrix.shape
    while stack:
        x,y = stack.pop()
        if 0 <= x < m and 0 <= y < n and matrix[x,y] <= h: # check bounds and height
            matrix[x,y] = 255 # set the value
            stack.append((x-1,y-1)) # add all directions to the stack, we check later
            stack.append((x,y-1))
            stack.append((x+1,y-1))
            stack.append((x-1,y))
            stack.append((x+1,y))
            stack.append((x-1,y+1))
            stack.append((x,y+1))
            stack.append((x+1,y+1))