Scipy标签扩张

时间:2012-10-05 13:29:36

标签: python numpy scipy

与我关于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]])

有些案例含糊不清,我不太确定它应该如何表现,但我认为我所追求的是明确的。

1 个答案:

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

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