停止注水算法

2024-03-28 10:09:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我坚持我的洪水填充算法:它停止在一个时刻,它“正常”不应该。。。你知道吗

情况是这样的:我有一个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


Tags: 算法ifstack情况矩阵像素matrixwest
1条回答
网友
1楼 · 发布于 2024-03-28 10:09:49

问题在于:

    (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))

相关问题 更多 >