Exercices Computer Vision Extraire une region d'interet (ROI)
🎉

Bravo!

Débutant 🧠 Fondamentaux 10 XP 0 personnes ont réussi

Extraire une region d'interet (ROI)

Quand un système de vidéosurveillance détecte un mouvement, il n'analyse pas l'image entière à chaque frame, ce serait bien trop lent. Il se concentre uniquement sur la zone où le mouvement a été repéré. Quand une application de floutage de visages traite une vidéo YouTube, elle extrait chaque visage détecté, le floute, puis le recolle à sa place. Cette zone ciblée s'appelle une ROI (Region of Interest, ou région d'intérêt en français).

C'est comme découper un article dans un journal. Tu prends tes ciseaux, tu découpes la zone qui t'intéresse, tu la colles ailleurs. Sauf qu'ici, tes ciseaux c'est du slicing NumPy.

En pratique, tu utiliserais le même slicing NumPy dans un vrai projet OpenCV. Il n'y a pas de fonction cv2 spéciale pour extraire une ROI, c'est du pur NumPy. Par contre, après avoir extrait une ROI, tu pourrais lui appliquer des opérations OpenCV (flou, détection, etc.) avant de la recoller.

Avec NumPy, extraire une ROI c'est du slicing 2D :

roi = image[y1:y2, x1:x2]

Attention : par défaut, le slicing NumPy donne une vue, pas une copie. Si tu modifies la vue, tu modifies l'original. Pour obtenir une vraie copie indépendante, utilise .copy().

Écris deux fonctions :

extraire_roi(image, y1, x1, y2, x2) qui renvoie une copie de la zone rectangulaire spécifiée.

coller_roi(image, roi, y, x) qui colle un array roi sur l'image à la position (y, x). La fonction renvoie l'image modifiée.

Exemple :
img = np.zeros((100, 100, 3), dtype=np.uint8)
img[10:30, 10:30] = [0, 0, 255] # un carré rouge
roi = extraire_roi(img, 10, 10, 30, 30)
roi.shape vaut (20, 20, 3)
coller_roi(img, roi, 50, 50) # colle le carré rouge à une autre position

Ce que tu devrais voir sur ta machine : le carré rouge apparaît à deux endroits de l'image.

Tests (5/5)

Extraire une ROI forme correcte
import numpy as np
img = np.zeros((20, 20, 3), dtype=np.uint8)
roi = extraire_roi(img, 5, 5, 15, 10)
assert roi.shape == (10, 5, 3), f'Forme attendue (10, 5, 3), obtenue {roi.shape}'
ROI est une copie independante
import numpy as np
img = np.zeros((10, 10, 3), dtype=np.uint8)
img[2:5, 2:5] = [100, 100, 100]
roi = extraire_roi(img, 2, 2, 5, 5)
roi[:] = [0, 0, 0]
assert img[3, 3, 0] == 100, 'La ROI extraite doit etre independante de l original'
Coller une ROI
import numpy as np
img = np.zeros((20, 20, 3), dtype=np.uint8)
roi = np.full((5, 5, 3), 200, dtype=np.uint8)
coller_roi(img, roi, 10, 10)
assert list(img[12, 12]) == [200, 200, 200], 'La ROI doit etre collee a la bonne position'
Coller ne modifie pas les autres pixels
import numpy as np
img = np.zeros((10, 10, 3), dtype=np.uint8)
roi = np.full((3, 3, 3), 255, dtype=np.uint8)
coller_roi(img, roi, 0, 0)
assert list(img[0, 0]) == [255, 255, 255]
assert list(img[5, 5]) == [0, 0, 0], 'Les pixels hors de la ROI ne doivent pas changer'
Extraire et recoller
import numpy as np
img = np.zeros((20, 20, 3), dtype=np.uint8)
img[0:5, 0:5] = [128, 64, 32]
roi = extraire_roi(img, 0, 0, 5, 5)
coller_roi(img, roi, 15, 15)
assert list(img[16, 16]) == [128, 64, 32]

Indices (3 disponibles)

solution.py