2017-04-11 89 views
1

我坚持我的洪水填充算法中:它停在那一瞬间,“正常”不应该......停止Floodfill算法

这里的情况:我有一个矩阵512×512个像素和值是50或100伊斯。 50的值正在形成一个正方形,我想在一个正方形中改变值为255(使用填充算法)。

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次,但没有更多。

谢谢你,问:

+0

你的矩阵[x-1,y] <= h:'不**检查边界。它检查矩阵的值。 –

回答

1

的问题这里位于:

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

经过测试你的代码,它完美的工作,它确实更简单。谢谢 ! – QuentinL

+0

@QuentinL:我发现你的代码有问题,并重写了答案。 –