Exercices Computer Vision Ajuster la luminosite et le contraste
🎉

Bravo!

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.

Tests (5/5)

Augmenter luminosite
import numpy as np
img = np.array([[100, 150]], dtype=np.uint8)
result = ajuster_luminosite_contraste(img, 1.0, 50)
assert result[0, 0] == 150
assert result[0, 1] == 200
Clipping a 255
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'
Contraste double
import numpy as np
img = np.array([[100, 50]], dtype=np.uint8)
result = ajuster_luminosite_contraste(img, 2.0, 0)
assert result[0, 0] == 200
assert result[0, 1] == 100
Image BGR 3D
import numpy as np
img = np.full((3, 3, 3), 100, dtype=np.uint8)
result = ajuster_luminosite_contraste(img, 1.5, 10)
assert result.dtype == np.uint8
expected = min(255, int(100 * 1.5 + 10))
assert result[1, 1, 0] == expected

Indices (3 disponibles)

solution.py