Exercices Computer Vision Créer et appliquer un masque binaire
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Créer et appliquer un masque binaire

Les masques binaires sont partout en vision par ordinateur industrielle. Quand un robot sur une chaîne de montage inspecte des pièces, il utilise un masque pour isoler la zone à vérifier et ignorer l'arrière-plan. Quand une application de retouche photo te permet de modifier uniquement le ciel d'une image, elle utilise un masque. Quand Google Maps floute les visages sur Street View, c'est un masque circulaire qui délimite la zone à flouter.

Pense à un pochoir pour la peinture. Tu poses le pochoir sur ta surface : la peinture passe à travers les trous (les zones blanches du masque) et le reste est protégé (les zones noires). C'est exactement le même principe avec les images numériques.

En pratique, tu utiliserais cv2.bitwise_and(image, image, mask=masque) pour appliquer un masque sur une image. Pour créer des masques, OpenCV propose cv2.rectangle() et cv2.circle() sur une image noire. Ici on le fait avec NumPy pour comprendre la géométrie des masques et le boolean indexing.

Pour appliquer un masque sur une image, on fait une opération élément par élément. Si le masque vaut 255 (ou True), on garde le pixel. Si le masque vaut 0 (ou False), on met le pixel à 0.

Avec un masque circulaire, tu calcules la distance de chaque pixel au centre et tu mets à 255 les pixels dont la distance est inférieure au rayon. La formule de distance euclidienne entre deux points c'est : sqrt((y - cy)^2 + (x - cx)^2).

Écris trois fonctions :

créer_masque_rectangle(hauteur, largeur, y1, x1, y2, x2) qui crée un masque 2D (dtype uint8) tout noir, sauf la zone rectangulaire (y1, x1) à (y2, x2) qui est blanche (255).

créer_masque_cercle(hauteur, largeur, cy, cx, rayon) qui crée un masque 2D avec un cercle blanc centré sur (cy, cx) de rayon donné.

appliquer_masque(image, masque) qui applique un masque 2D sur une image BGR (3D). Les pixels où le masque vaut 0 deviennent noirs. Renvoie l'image masquée.

Exemple :
masque = créer_masque_rectangle(100, 100, 20, 20, 80, 80)
masque[50, 50] vaut 255 (dans le rectangle)
masque[0, 0] vaut 0 (hors du rectangle)

Ce que tu devrais voir sur ta machine : seule la zone du masque est visible, le reste est noir.

Tests (5/5)

Masque rectangle zone blanche
import numpy as np
m = créer_masque_rectangle(20, 20, 5, 5, 15, 15)
assert m[10, 10] == 255, 'Le centre du rectangle doit etre blanc'
assert m[0, 0] == 0, 'L exterieur doit etre noir'
Masque cercle centre
import numpy as np
m = créer_masque_cercle(20, 20, 10, 10, 5)
assert m[10, 10] == 255, 'Le centre du cercle doit etre blanc'
assert m[0, 0] == 0, 'Loin du cercle doit etre noir'
Masque cercle bord
import numpy as np
m = créer_masque_cercle(20, 20, 10, 10, 3)
assert m[10, 13] == 255, 'Le pixel sur le rayon doit etre blanc'
assert m[10, 14] == 0, 'Le pixel hors du rayon doit etre noir'
Appliquer masque
import numpy as np
img = np.full((10, 10, 3), 200, dtype=np.uint8)
masque = np.zeros((10, 10), dtype=np.uint8)
masque[3:7, 3:7] = 255
result = appliquer_masque(img, masque)
assert list(result[5, 5]) == [200, 200, 200], 'Les pixels sous le masque blanc doivent etre conserves'
assert list(result[0, 0]) == [0, 0, 0], 'Les pixels sous le masque noir doivent etre noirs'
Appliquer masque ne modifie pas l original
import numpy as np
img = np.full((5, 5, 3), 100, dtype=np.uint8)
masque = np.zeros((5, 5), dtype=np.uint8)
result = appliquer_masque(img, masque)
assert np.all(img == 100), 'L image originale ne doit pas etre modifiee'

Indices (3 disponibles)

solution.py