2017-04-11 83 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:我發現你的代碼有問題,並重寫了答案。 –