2017-04-11 10 views
1

私は私の塗りつぶしALGOとこだわっている:私は行列に512個の* 512個のピクセルと値を持っている:それは「正常」べきではない...ここで 停止FLOODFILLアルゴリズム

状況だ瞬間に停止します50または100-ishのいずれかです。 50の値は正方形の中で、255の値(floodfill algoを使用)で変更したい正方形を形成しています。

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.、

+0

行列の値をチェックします。 –

答えて

1

をありがとう:あなたが最初の要素を取得しますが、最後の1を削除しているので、それが可能である

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

(のように、おそらく常にケース) 、そのではないスタック上にプッシュされるすべての要素が評価されます。

それでもは複雑すぎるです。あなたの `matrix [x-1、y] <= h:` does not ** check boundをチェックしてください:

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:あなたのコードに問題が見つかりました。答えを書き換えました。 –

関連する問題