私は行列がバイナリであると仮定しています。ここで、非ゼロ値は抽出されたセグメントを表し、ゼロ値は気にしない値です。 measure
モジュールからscikit-image
label
機能に関心があってもよい: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つの接続を使用すると、右下隅が別のラベルに分類されますが、デフォルトの接続性(フル)を使用すると、すべてのピクセルが同じラベルとして分類されます。