2017-08-09 18 views
0

私は1つ以上のブロブを持つバイナリイメージを持っています。私は各ブロブのピクセルのリストが必要です。各ブロブのシード点を1つ見つけることができれば、そのブロブのピクセルを見つけるために塗りつぶすことができます。GPUのblob境界ボックスにコンポーネントのラベルを付けて接続

この問題についていくつかの調査をして、私が望むアルゴリズムは「接続されたコンポーネントのラベル付け」だと思います。ほとんどの例では、ブロブの出力にカラーコードが表示されています。このアルゴリズムでは、私は収集することができます:ブロブの1つのポイント、およびブロブの境界整列された軸の軸ですか?

接続されたコンポーネントのラベル付けは、必要なものに対して適切なアルゴリズムのように聞こえるのですか?誰かが良いCUDAを実装していますか?

+0

はい、接続されたコンポーネントは必要なものです。各ブロブに異なる色のラベルが付いた画像がある場合、画像内の各色の最大と最小のピクセル座標を取ることによって、境界ボックスを簡単に計算できます。 – jodag

+0

処理が非常にデータに依存し、不規則であるため、CUDAの実装は困難です。サブ画像で画像を分割することは、タイルを処理した後に部分を修正する必要があるため、困難です。 –

答えて

1

あなたの提案は良い出発点です。

画像を行単位でスキャンし、黒いピクセルの開始洪水を満たしたときにそれを満たしてください。塗りつぶしている間に、バウンディングボックスを更新したままにすることができます。塗りつぶした後、スキャンを続行するだけです。

Fill(img, x, y, xm, xM, ym, yM): 
    img[x][y]= white 
    xm= min(xm, x); xM= max(xM, x); ym= min(ym, y); yM= max(yM, y); 
    if x >= 0 and img[x-1][y] == black: 
     Fill(img, x-1, y) 
    if x < w and img[x+1][y] == black: 
     Fill(img, x+1, y) 
    if y >= 0 and img[x][y-1] == black: 
     Fill(img, x, y-1) 
    if y < h and img[x][y+1] == black: 
     Fill(img, x, y+1) 

FloodFill(img): 
    for y in range(h): 
     for x in range(w): 
      if Img[x][y] == black: 
       xm= xM= x; ym= yM= y 
       Fill(img, x, y, xm, xM, ym, yM) 
       Store(x, y, xm, xM, ym, yM) 

フラッド充填がスタック集約されるように、scanline-basedアプローチが推奨されます。

関連する問題