3

与我关于侵蚀 scipy label array 的问题类似,我正在尝试扩大标签区域。

棘手的部分是防止不同地区“相互入侵”。

从开始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

一种选择是仅使用最大过滤器,然后重置任何“入侵”的区域。

举个例子:

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]]

在扩张的区域中,最大的数字总是“获胜”。无论如何,这是一种方法。

于 2012-10-06T21:25:08.873 回答
0

另一种选择是使用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 回答