从RGB像素值创建布尔蒙版python

时间:2019-03-14 13:40:10

标签: python arrays numpy rgb boolean-expression

我有以下具有RGB值和相应类别的图像蒙版:

  1. BG:255 0 0
  2. 面孔:255 255 0
  3. 头发:127 0 0
  4. 眼睛:0 0 255
  5. 鼻子:0 255 255
  6. 嘴:0 255 0

现在我想在像素级别上每个类具有一个布尔型numpy数组,以便每个像素具有相应的类,即每个类的[length,width]布尔型数组,每个像素的值为True或False,具体取决于是否它属于该类。

对于BG,嘴巴和眼睛,我可以简单地复制轴0、1或2,然后使用np.bool将其转换为True或False(255 = True,0 = False)。

但是,对于其他类,我在不使用double for循环的情况下努力工作。有人可以在不使用for循环的情况下帮助我获得我想要的东西吗?

2 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

labels = {'bg' : [255, 0, 0],
'face' : [255, 255, 0],
'hair' : [127, 0, 0],
'eyes' : [0,0,255],
'nose' : [0, 255, 255],
'mouth' : [0,255,0],
}

arr = np.random.choice([0,127,255], size=(3,500,500)) # simulated image



for key in labels.keys():
    key_img = (arr[0,...]==labels[key][0]) * (arr[1,...]==labels[key][1]) *     (arr[2,...]==labels[key][2])
    # do something with key_img

btw:

  

对于BG,嘴巴和眼睛,我可以简单地复制轴0、1或2,然后使用np.bool将其转换为True或False(255 = True,0 = False)。

将导致标签不明确。例如,鼻子得分为BG和眼睛得分

答案 1 :(得分:0)

您可以利用numpy广播:

一个例子:

>>> pprint(labels)
{'BG': array([255,   0,   0]),
 'eyes': array([  0,   0, 255]),
 'face': array([255, 255,   0]),
 'hair': array([127,   0,   0]),
 'mouth': array([  0, 255,   0]),
 'nose': array([  0, 255, 255])}
>>> example
array([[[255,   0,   0],
        [127,   0,   0],
        [255,   0,   0],
        [255,   0,   0]],

       [[255, 255,   0],
        [  0, 255,   0],
        [255,   0,   0],
        [  0, 255,   0]],

       [[  0,   0, 255],
        [255, 255,   0],
        [  0,   0, 255],
        [  0,   0, 255]]])

使用广播可以同时检查三个频道。然后沿着轴2使用all,我们可以选择满足所有三个相等性的点。

>>> masks = {k: (example==v).all(2) for k, v in labels.items()}

仅此而已。结果:

>>> pprint(masks)
{'BG': array([[ True, False,  True,  True],
       [False, False,  True, False],
       [False, False, False, False]]),
 'eyes': array([[False, False, False, False],
       [False, False, False, False],
       [ True, False,  True,  True]]),
 'face': array([[False, False, False, False],
       [ True, False, False, False],
       [False,  True, False, False]]),
 'hair': array([[False,  True, False, False],
       [False, False, False, False],
       [False, False, False, False]]),
 'mouth': array([[False, False, False, False],
       [False,  True, False,  True],
       [False, False, False, False]]),
 'nose': array([[False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])}