Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Ajuster la luminosite et le contraste
Quand tu prends une photo dans un parking souterrain, elle est trop sombre. Quand tu photographies la neige, elle est trop claire et plate. Les caméras de surveillance la nuit capturent des images à peine visibles. Ajuster la luminosité et le contraste, c'est la première chose qu'on fait pour rendre une image exploitable, que ce soit pour de la retouche photo, de la vidéosurveillance ou du pré-traitement en machine learning.
Pense à un bouton de volume et un bouton de tonalité sur une chaîne hi-fi. La luminosité (beta), c'est le volume : ça monte ou descend tout d'un cran. Le contraste (alpha), c'est la tonalité : ça accentue la différence entre les sons forts et faibles. Ensemble, ils permettent d'optimiser le résultat.
En pratique, tu utiliserais cv2.convertScaleAbs(image, alpha=alpha, beta=beta) qui fait exactement ça en une ligne et gère le clipping automatiquement. Ici on le fait avec NumPy pour bien comprendre la formule sous-jacente.
La formule classique pour ajuster les deux est :
pixel_sortie = alpha * pixel_entree + beta
alpha contrôle le contraste : alpha > 1 : plus de contraste (les clairs deviennent plus clairs, les sombres plus sombres) alpha < 1 : moins de contraste (tout se rapproche du gris moyen) alpha = 1 : pas de changement de contraste
beta contrôle la luminosité : beta > 0 : plus lumineux beta < 0 : plus sombre beta = 0 : pas de changement
Attention au clipping : le résultat doit rester entre 0 et 255. Un pixel qui dépasserait 255 est ramené à 255, et un pixel qui descendrait en dessous de 0 est ramené à 0. NumPy fournit np.clip() pour ça.
Écris une fonction ajuster_luminosite_contraste(image, alpha, beta) qui prend une image (2D ou 3D, dtype uint8), un facteur de contraste alpha (float) et un décalage de luminosité beta (float), et renvoie l'image ajustée (dtype uint8).
Exemple : img = np.array([[100, 150], [200, 50]], dtype=np.uint8) ajuster_luminosite_contraste(img, 1.0, 50) donne [[150, 200], [250, 100]] (200 + 50 = 250, pas 255 car on clippe après)
Ce que tu devrais voir sur ta machine : augmente beta pour éclaircir une photo sombre, augmente alpha pour renforcer le contraste d'une photo plate.
import numpy as np
img = np.array([[200]], dtype=np.uint8)
result = ajuster_luminosite_contraste(img, 1.0, 100)
assert result[0, 0] == 255, 'Le pixel doit etre clippe a 255'
Clipping a 0
import numpy as np
img = np.array([[50]], dtype=np.uint8)
result = ajuster_luminosite_contraste(img, 1.0, -100)
assert result[0, 0] == 0, 'Le pixel doit etre clippe a 0'