类似于我关于 eroding a 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]])
有些情况是模棱两可的,我不太确定它应该如何表现,但我认为我所追求的是明确的。
最佳答案
一种选择是只使用最大过滤器,然后重置任何“被入侵”的区域。
举个例子:
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]]
在扩张区域,最大的数字总是“赢”。无论如何,这是一种方法。
关于python - Scipy 标签扩张,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747319/