与我关于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]])
有些案例含糊不清,我不太确定它应该如何表现,但我认为我所追求的是明确的。
答案 0 :(得分: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]]
在扩张的区域,最大的数字总是“胜利”。无论如何,这是一种方法。