2016-09-27 51 views
2

我有一个numpy布尔二维数组,表示一个灰度图像,它基本上是一个空白形状(三角形,正方形,圆形),由白色像素组成True,黑色像素为False。我想通过将白色像素修改为黑色像素来添加黑色填充。在列和行的范围内的Numpy数组操作

array([[True, True, True, False, False, False, False, False, True, True, True], 
     [True, True, True, False, True, True, True, False, True, True, True], 
     [True, True, True, False, True, True, True, False, True, True, True], 
     [True, True, True, False, True, True, True, False, True, True, True], 
     [True, True, True, False, False, False, False, False, True, True, True]]) 

(这9个True在这阵中间的平方值应该成为False

是否有一个numpy的切片方法,这将使这个简单/快吗?有什么我可以随时修改所有True s False,然后是True,直到False的下一个实例?

+0

沿行可能有多个对象吗? – Divakar

+0

只是一个对象。 – Gmo

回答

0

根据你的逻辑,你可以用假替换第一个假和假最后之间的所有值:

def mutate(A): 
    ind = np.where(~A)[0] 
    if len(ind) != 0: 
     A[ind.min():ind.max()] = False 
    return A 


np.apply_along_axis(mutate, 1, arr) 

# array([[ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True], 
#  [ True, True, True, False, False, False, False, False, True, 
#   True, True]], dtype=bool) 
1

在这里,人们的想法,很容易实现,而且相当快速地执行。

我会使用0和1,因此看起来更清晰一些。

这里的起始数组:

使用 np.logical_and.accumulate,翻转左到右,再次做同样的,翻转后,左到右
>>> a 
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], 
     [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], 
     [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]]) 

厚积薄发和“或”两列在一起:

>>> andacc = np.logical_and.accumulate 
>>> (andacc(a, axis=1) | andacc(a[:, ::-1], axis=1)[:, ::-1]).astype(int) 
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]]) 

(漏下.astype(int)保持布尔数组,而不是0和1)。

这里有一个三角形:

>>> b 
array([[1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1], 
     [1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1], 
     [1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1], 
     [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0]]) 

>>> (andacc(b, axis=1) | andacc(b[:, ::-1], axis=1)[:, ::-1]).astype(int) 
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], 
     [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1], 
     [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])