3

scipyラベル配列の侵食に関する私の質問と同様に、ラベル領域を拡張しようとしています。

トリッキーな部分は、さまざまな地域が「互いに侵入」しないようにすることです。

から始めてA、どうすれば次のようなものを入手できますBか?

A = array([[0, 0, 0, 0, 0, 0, 0, 0],
           [0, 1, 1, 2, 2, 0, 0, 0],
           [0, 1, 1, 2, 2, 0, 3, 3],
           [0, 0, 0, 0, 0, 0, 3, 3],
           [0, 0, 0, 0, 0, 0, 3, 3],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0]])

B = array([[1, 1, 1, 2, 2, 2, 0, 0],
           [1, 1, 1, 2, 2, 2, 3, 3],
           [1, 1, 1, 2, 2, 2, 3, 3],
           [1, 1, 1, 2, 2, 3, 3, 3],
           [0, 0, 0, 0, 0, 3, 3, 3],
           [0, 0, 0, 0, 0, 3, 3, 3],
           [0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0]])

あいまいな場合もあり、どう振る舞うべきかよくわかりませんが、何を求めているのかは明らかだと思います。

4

2 に答える 2

3

1 つのオプションは、最大フィルターを使用してから、「侵略」された領域をリセットすることです。

例として:

import numpy as np
import scipy.ndimage as ndimage

A = np.array([[0, 0, 0, 0, 0, 0, 0, 0],
              [0, 1, 1, 2, 2, 0, 0, 0],
              [0, 1, 1, 2, 2, 0, 3, 3],
              [0, 0, 0, 0, 0, 0, 3, 3],
              [0, 0, 0, 0, 0, 0, 3, 3],
              [0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0]])

B = ndimage.maximum_filter(A, 3)
B[A != 0] = A[A != 0]

print B

これにより、次の結果が得られます。

[[1 1 2 2 2 2 0 0]
 [1 1 1 2 2 3 3 3]
 [1 1 1 2 2 3 3 3]
 [1 1 2 2 2 3 3 3]
 [0 0 0 0 0 3 3 3]
 [0 0 0 0 0 3 3 3]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]]

膨張した領域では、最大数が常に「勝ち」ます。いずれにせよ、それは1つのアプローチです。

于 2012-10-06T21:25:08.873 に答える
0

もう 1 つのオプションは、2D 最近傍補間を使用してラベル領域を拡張し、すべてのゼロ値を埋めることです。

import numpy as np
from scipy import interpolate as it
from scipy import ndimage as nd


A = np.array([[0, 0, 0, 0, 0, 0, 0, 0],
              [0, 1, 1, 2, 2, 0, 0, 0],
              [0, 1, 1, 2, 2, 0, 3, 3],
              [0, 0, 0, 0, 0, 0, 3, 3],
              [0, 0, 0, 0, 0, 0, 3, 3],
              [0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0]])
mask = ~(A == 0)
xy = np.where(mask)
interp = it.NearestNDInterpolator(np.transpose(xy), A[xy])
B = interp(*np.indices(A.shape))
print(B)

これにより、次の結果が得られます。

[[1 1 1 2 2 2 3 3]
 [1 1 1 2 2 2 3 3]
 [1 1 1 2 2 2 3 3]
 [1 1 1 2 2 3 3 3]
 [1 1 1 2 2 3 3 3]
 [1 1 1 2 3 3 3 3]
 [1 1 1 3 3 3 3 3]
 [1 1 1 3 3 3 3 3]]

次に、バイナリ膨張を使用して、反復を使用してラベル領域を膨張させるピクセル数を設定できます。私たちの場合、1ピクセルなのでiterations=1

C = nd.binary_dilation(mask, structure=np.ones((3,3)), iterations=1).astype(A.dtype)
D = C * B

print(D)

これにより、次の結果が得られます。

[[1 1 1 2 2 2 0 0]
 [1 1 1 2 2 2 3 3]
 [1 1 1 2 2 2 3 3]
 [1 1 1 2 2 3 3 3]
 [0 0 0 0 0 3 3 3] 
 [0 0 0 0 0 3 3 3]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]]
于 2021-12-07T14:16:11.607 に答える