2

0 と 1 の N*N 配列を指定して、クラスターのリストを作成したいと思います (クラスターとは、1 でラベル付けされた接続点のセットです)。

scipy.ndimage.labelどのポイントが接続されているかがわかるので、非常に便利です。

しかし、配列に周期的な境界条件、つまりポイント(0,j)(N,j)識別 (シリンダーを作るために接着する平面のように) も必要です。したがって、機能が境界を介して接続されていることを scipy.ndimage.label に伝える必要があります。

たとえば、元の配列が次の場合:

In[187]: a = [[1, 1, 0, 0, 0, 0, 1, 1],[1, 1, 0, 1, 0, 0, 1, 1],[1, 1, 0, 0, 0, 1, 1, 1]] 

labels = measurements.label(a)
print(labels)
Out [187]: (array([[1, 1, 0, 0, 0, 0, 2, 2],
   [1, 1, 0, 3, 0, 0, 2, 2],
   [1, 1, 0, 0, 0, 2, 2, 2]], dtype=int32), 3)

そして私はしたい:

(array([[1, 1, 0, 0, 0, 0, 1, 1],
   [1, 1, 0, 3, 0, 0, 1, 1],
   [1, 1, 0, 0, 0, 1, 1, 1]], dtype=int32), 2)

label の構造パラメータを使用すると、接続を指定できます (たとえば、フィーチャが斜めに接触していても接続されている)、その目的にも使用できますか?

4

1 に答える 1

3

以下は、左右の境界に周期的な境界条件を課す例です。右側の各ラベルは、対応する左側のラベルで識別されます (存在する場合)。

for y in range(label_image.shape[0]):
    if label_image[y, 0] > 0 and label_image[y, -1] > 0:
        label_image[label_image == label_image[y, -1]] = label_image[y, 0]

上限と下限についても同様のことができます。他の境界条件を考え出し、forループ内の境界ピクセルを反復処理して、ifステートメント内の条件を同様の方法でチェックすることもできます。

于 2019-05-02T14:14:14.370 に答える