2016-08-26 15 views
1

私は、画像からセグメント化された2次元マトリックスを表すnumpy配列を持っています。基本的には、それは画像のセグメントのアウトラインである閉じた形状の束を持つ疎マトリックスです。私がする必要があるのは、numpyの異なる色/ラベルで、閉じた各図形内の空のピクセルをカラー化することです。numpy/pythonでのFloodfillセグメント化画像

私はPILでfloodfillでこれを行うことができますが、私はnumpyからPILに行列を前後に変換する必要がないようにしようとしています。 skimageやsklearnのようなsometingの関数があって、私のマトリックスの異なる閉じた領域をすべて私のために別のラベルで "自動ラベル"することができればいいでしょう(単調に増加する整数や色かもしれません)。その領域内の隣接するピクセルの正確なグループ分けを表している限り)注意してください。

私は自分のフロッドフィルを実装しようと多くの時間を費やしていました。この時点では、イメージを私のためにボックスに書き出すことができます。

答えて

1

私は行列がバイナリであると仮定しています。ここで、非ゼロ値は抽出されたセグメントを表し、ゼロ値は気にしない値です。 measureモジュールからscikit-imagelabel機能に関心があってもよい:http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.label

それは本質的に連結成分解析を実行し、整数で全て別々に閉じた構成要素を一緒にラベル。接続の指定方法には注意が必要です。北、南、東、西のみの方向を使用して接続地域を見つけた場合は4接続性と8接続性があり、8接続性は8方向(北、南、東、西、北東、南東、北西、南西)。 connectivityオプションを使用し、4接続の場合は1、8接続の場合は2を指定します。

ただし、デフォルトの接続性は完全な接続性であるため、2Dの場合は2オプションになります。私はあなたがこの方法であると思う。あなたのマトリックス中のゼロである任意のブロブは0とラベル付けされます。さらに騒ぎがなければ、ここでは非常に単純な再現性の例です:

In [1]: from skimage.measure import label 

In [2]: import numpy as np 

In [3]: x = np.zeros((8,8)) 

In [4]: x[0:4,0:4] = 1 

In [5]: x[6:8,6:8] = 1 

In [6]: x 
Out[6]: 
array([[ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 1., 1.]]) 

In [7]: label(x) 
Out[7]: 
array([[1, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 2, 2], 
     [0, 0, 0, 0, 0, 0, 2, 2]], dtype=int64) 

私たちは、私は左上と右下に作成された2つの別々の島があることがわかります。 label関数を実行すると、互いに属しているピクセルの領域を識別するラベル行列が返されます。同じIDを持つピクセルは、同じ地域に属するピクセルを意味します。接続が戦場に出るか

はあなたを表示するには、ここで別の簡単な例です:

In [1]: import numpy as np 

In [2]: from skimage.measure import label 

In [3]: y = np.array([[0,1,0,0],[1,1,1,0],[0,1,0,1]]) 

In [4]: y 
Out[4]: 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [0, 1, 0, 1]]) 

In [5]: label(y, connectivity=1) 
Out[5]: 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [0, 1, 0, 2]], dtype=int64) 

In [6]: label(y) 
Out[6]: 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [0, 1, 0, 1]], dtype=int64) 

入力が左上隅と右下隅にある別の非ゼロ値のクロスパターンを有しています。 4つの接続を使用すると、右下隅が別のラベルに分類されますが、デフォルトの接続性(フル)を使用すると、すべてのピクセルが同じラベルとして分類されます。

関連する問題