J'ai les masques d'image suivants avec des valeurs RVB et les classes correspondantes:

  1. BG: 255 0 0
  2. face: 255 255 0
  3. cheveux: 127 0 0
  4. yeux: 0 0 255
  5. nez: 0255255
  6. bouche: 0 255 0

Maintenant, je veux avoir un tableau numpy booléen par classe au niveau du pixel, de sorte que par pixel, j'ai la classe correspondante, c'est-à-dire un tableau booléen par classe de [longueur, largeur] avec True ou False pour chaque pixel selon qu'il appartient à cette classe.

Pour BG, la bouche et les yeux, je peux simplement copier l'axe 0, 1 ou 2 et utiliser np.bool pour le convertir en vrai ou faux (255 = vrai, 0 = faux).

Pour les autres classes cependant, j'ai du mal à faire fonctionner cela sans utiliser de boucle double. Quelqu'un peut-il m'aider à obtenir ce que je veux sans utiliser de boucle for?

0
Peter Lawrence 14 mars 2019 à 16:40

2 réponses

Meilleure réponse

Que diriez-vous quelque chose comme ça?

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:

Pour BG, la bouche et les yeux, je peux simplement copier l'axe 0, 1 ou 2 et utiliser np.bool pour le convertir en vrai ou faux (255 = vrai, 0 = faux).

Conduirait à des étiquettes ambiguës. le nez marquerait comme BG et les yeux, par exemple

0
warped 14 mars 2019 à 14:31

Vous pouvez tirer parti de la diffusion numpy:

Un exemple:

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

L'utilisation de la diffusion des trois canaux peut être vérifiée simultanément. Ensuite, en utilisant all le long de l'axe 2, nous pouvons sélectionner les points qui satisfont aux trois égalités.

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

C'est tout. Résultat:

>>> 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]])}
0
Paul Panzer 14 mars 2019 à 15:23