Exercices Computer Vision Detecter une couleur dans une image BGR
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Detecter une couleur dans une image BGR

La détection de couleur est partout dans la vie réelle. Les robots de tri dans les centres de recyclage séparent les déchets par couleur. Les voitures autonomes détectent les feux rouges et verts. Les applications sportives suivent un ballon orange sur le terrain. Les systèmes de contrôle qualité en agroalimentaire trient les fruits par maturité en analysant leur couleur.

Le principe est comme un filtre de recherche sur un site e-commerce. Tu dis "je veux des chaussures entre 50 et 100 euros, de taille 42 à 44". Ici, tu dis "je veux des pixels dont le bleu est entre 200 et 255, le vert entre 0 et 50, et le rouge entre 0 et 50". Si les trois conditions sont remplies, le pixel est accepté.

En pratique, tu utiliserais cv2.inRange(image, seuil_bas, seuil_haut) qui fait exactement ça en une ligne. Pour des résultats encore meilleurs, on convertit souvent en HSV avec cv2.cvtColor(image, cv2.COLOR_BGR2HSV) car l'espace HSV sépare la teinte de la luminosité, ce qui rend la détection plus robuste aux variations d'éclairage. Ici on reste en BGR pour comprendre le mécanisme de base.

Pour chaque canal BGR, tu définis un seuil bas et un seuil haut. Un pixel est considéré comme "de la bonne couleur" si ses trois canaux sont tous dans les intervalles définis.

Par exemple, pour détecter du bleu pur :
seuil_bas = [200, 0, 0] (B >= 200, G >= 0, R >= 0)
seuil_haut = [255, 50, 50] (B <= 255, G <= 50, R <= 50)

Écris deux fonctions :

detecter_couleur(image, seuil_bas, seuil_haut) qui prend une image BGR (3D, uint8) et deux listes de 3 valeurs [B, G, R]. Renvoie un masque binaire 2D (0 ou 255, uint8) où les pixels blancs sont ceux dont la couleur est dans l'intervalle.

compter_pixels_couleur(image, seuil_bas, seuil_haut) qui renvoie le nombre de pixels dont la couleur est dans l'intervalle et le pourcentage qu'ils représentent, sous forme de dictionnaire avec 'nb_pixels' (int) et 'pourcentage' (float arrondi à 2 décimales).

Exemple :
img = np.zeros((10, 10, 3), dtype=np.uint8)
img[0:5, :] = [255, 0, 0] # moitié haute en bleu
masque = detecter_couleur(img, [200, 0, 0], [255, 50, 50])
Les 50 pixels bleus sont blancs dans le masque, les 50 noirs restent noirs.

Ce que tu devrais voir sur ta machine : charge une photo colorée et isole une couleur. Par exemple, détecte le rouge d'un panneau stop.

Tests (5/5)

Detecter bleu pur
import numpy as np
img = np.zeros((10, 10, 3), dtype=np.uint8)
img[0:5, :] = [255, 0, 0]
masque = detecter_couleur(img, [200, 0, 0], [255, 50, 50])
assert masque[2, 5] == 255, 'Les pixels bleus doivent etre detectes'
assert masque[7, 5] == 0, 'Les pixels noirs ne doivent pas etre detectes'
Masque forme 2D
import numpy as np
img = np.zeros((8, 12, 3), dtype=np.uint8)
masque = detecter_couleur(img, [0, 0, 0], [255, 255, 255])
assert masque.shape == (8, 12), f'Le masque doit etre 2D, obtenu {masque.shape}'
Compter pixels
import numpy as np
img = np.zeros((10, 10, 3), dtype=np.uint8)
img[0:5, :] = [255, 0, 0]
result = compter_pixels_couleur(img, [200, 0, 0], [255, 50, 50])
assert result['nb_pixels'] == 50
assert result['pourcentage'] == 50.0
Aucun pixel detecte
import numpy as np
img = np.zeros((5, 5, 3), dtype=np.uint8)
result = compter_pixels_couleur(img, [200, 200, 200], [255, 255, 255])
assert result['nb_pixels'] == 0
assert result['pourcentage'] == 0.0
Detection partielle
import numpy as np
img = np.zeros((4, 4, 3), dtype=np.uint8)
img[0, 0] = [100, 50, 50]
img[1, 1] = [150, 50, 50]
img[2, 2] = [200, 50, 50]
masque = detecter_couleur(img, [120, 0, 0], [255, 100, 100])
assert masque[0, 0] == 0, 'B=100 est sous le seuil bas 120'
assert masque[1, 1] == 255
assert masque[2, 2] == 255

Indices (3 disponibles)

solution.py