从 RGB 像素值创建布尔掩码 python

Creating boolean masks from RGB pixel values python

我有以下带有 RGB 值和相应 classes 的图像蒙版:

  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

现在我想在像素级上每个 class 有一个布尔 numpy 数组,这样每个像素我都有相应的 class,即每个 class 的布尔数组 [ length, width] 每个像素的 True 或 False 取决于它是否属于那个 class.

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

然而,对于其他 classes,我正在努力使它在不使用双 for 循环的情况下工作。有人可以帮助我在不使用 for 循环的情况下获得我想要的东西吗?

这样的怎么样?

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

顺便说一句:

For BG, mouth and eyes, I can simple copy axis 0, 1, or 2 and use np.bool to convert it to True or False (255 = True, 0 = False).

会导致标签不明确。例如,鼻子会被评分为 BG 和眼睛

您可以利用 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]]])

使用广播可以同时查看三个频道。然后使用 all 沿轴 2 我们可以 select 满足所有三个等式的点。

>>> 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]])}