2017-06-21 20 views
1

バイナリイメージ内の接続されたコンポーネントを識別するためのコードを記述しました。私は再帰的な深さの最初の検索を使用しています。しかし、いくつかの画像では、Python再帰制限では十分ではありません。コンピュータでサポートされている最大限の制限に上限を増やしても、一部の画像ではまだプログラムが失敗します。どのようにしてDFSを繰り返し実装できますか?それとも他に良い解決策がありますか?Python非再帰的な深さの最初の検索

マイコード:

count=1 
height = 4 
width = 5 
g = np.zeros((height+2,width+2)) 
w = np.zeros((height+2,width+2)) 
dx = [-1,0,1,1,1,0,-1,-1] 
dy = [1,1,1,0,-1,-1,-1,0] 

def dfs(x,y,c): 
    global w 
    w[x][y]=c 
    for i in range(8): 
     nx = x+dx[i] 
     ny = y+dy[i] 
     if g[nx][ny] and not w[nx][ny]: 
      dfs(nx,ny,c) 

def find_connected_components(image): 
    global count,g 
    g[1:-1,1:-1]=image 
    for i in range(1,height+1): 
      for j in range(1,width+1): 
        if g[i][j] and not w[i][j]: 
         dfs(i,j,count) 
         count+=1 

mask1 = np.array([[0,0,0,0,1],[0,1,1,0,1],[0,0,1,0,0],[1,0,0,0,1]]) 
find_connected_components(mask1) 
print mask1 
print w[1:-1,1:-1] 

入力と出力:

[[0 0 0 0 1] 
[0 1 1 0 1] 
[0 0 1 0 0] 
[1 0 0 0 1]] 
[[ 0. 0. 0. 0. 1.] 
[ 0. 2. 2. 0. 1.] 
[ 0. 0. 2. 0. 0.] 
[ 3. 0. 0. 0. 4.]] 
+0

は、あなたが実行する必要がdfs' 'への呼び出しのパラメータを記録し、それに残って何もループ内で、ありませんまで、スタックをポップするタスクスタックを使用しています。 –

+0

私は、再帰呼び出しを置き換える、dfs関数の最後の行のスタックにプッシュすると仮定します。スタックからポップして必要な操作を実行する場所はどこですか? – Sibi

+1

私は繰り返しの再帰的な洪水記入を再現する私の答えを見つけることができます:https://stackoverflow.com/questions/40963288/fatal-python-error-cannot-recover-from-stack-overflow-during-flood -fill –

答えて

1
  1. は、
  2. は、それぞれの場所を訪問し、whileループを使用して訪問する場所のリストを持っているからそれを飛び出ますあなたがするようにリスト。そのよう

def dfs(x,y,c): 
    global w 
    locs = [(x,y,c)] 
    while locs: 
     x,y,c = locs.pop() 
     w[x][y]=c 
     for i in range(8): 
      nx = x+dx[i] 
      ny = y+dy[i] 
      if g[nx][ny] and not w[nx][ny]: 
       locs.append((nx, ny, c)) 
関連する問題