Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Convertir BGR en RGB et en niveaux de gris
OpenCV utilise BGR au lieu de RGB. Si tu ne le sais pas, toutes tes images auront des couleurs inversées quand tu les afficheras avec Matplotlib ou que tu les enverras sur le web. C'est LE piège classique en computer vision, et tout le monde tombe dedans au moins une fois. Les visages deviennent bleus, le ciel devient orange, et tu passes une heure à chercher un bug qui n'en est pas un.
Pense aux trois couches de peinture : bleu, vert, rouge. OpenCV les range dans l'ordre B, G, R. Mais quand tu affiches avec Matplotlib, Pillow ou un navigateur web, ils s'attendent à R, G, B. Il faut juste inverser l'ordre des couches.
En pratique, tu utiliserais cv2.cvtColor(image, cv2.COLOR_BGR2RGB) pour la conversion BGR vers RGB, et cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) pour passer en niveaux de gris. Ici on le fait avec NumPy pour comprendre ce qui se passe sous le capot.
La conversion BGR vers RGB est simple : on inverse l'ordre des canaux avec le slicing : rgb = bgr[:, :, ::-1]
Le ::-1 sur le troisième axe inverse l'ordre des canaux. Le bleu (index 0) devient le rouge (index 2) et inversement. Le vert (index 1) reste au milieu.
Pour convertir en niveaux de gris, on utilise la formule de luminance, qui prend en compte la sensibilité de l'oeil humain : gris = 0.299 * R + 0.587 * G + 0.114 * B
Cette formule donne plus de poids au vert (notre oeil est plus sensible au vert) et moins au bleu. Le résultat est un array 2D (plus de canaux), avec des valeurs de 0 (noir) à 255 (blanc). C'est aussi la formule utilisée par la télévision pour convertir la couleur en noir et blanc.
Écris deux fonctions :
bgr_vers_rgb(image) qui prend une image BGR (array 3D) et renvoie l'image en RGB.
bgr_vers_gris(image) qui prend une image BGR et renvoie une image en niveaux de gris (array 2D, dtype uint8). Utilise la formule de luminance ci-dessus.
Exemple : img_bgr = np.array([[[255, 0, 0]]], dtype=np.uint8) # un pixel bleu pur bgr_vers_rgb(img_bgr) donne [[[0, 0, 255]]] # ce pixel est maintenant rouge en RGB
Ce que tu devrais voir sur ta machine : si tu charges une photo avec cv2.imread et que tu l'affiches avec matplotlib.pyplot.imshow après conversion RGB, les couleurs seront correctes. Sans conversion, les rouges et les bleus sont inversés.
Tests (5/5)
BGR vers RGB pixel bleu
import numpy as np
img = np.array([[[255, 0, 0]]], dtype=np.uint8)
result = bgr_vers_rgb(img)
assert list(result[0, 0]) == [0, 0, 255], 'Le bleu BGR doit devenir rouge en RGB'