Exercices Computer Vision Egaliser l'histogramme d'une image
🎉

Bravo!

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

Egaliser l'histogramme d'une image

L'égalisation d'histogramme est utilisée en imagerie médicale pour améliorer le contraste des radiographies et des IRM, rendant les structures anatomiques plus visibles pour le diagnostic. En vidéosurveillance, elle permet de rendre exploitables des images capturées dans des conditions de faible éclairage. En photographie sous-marine, où tout est teinté de bleu-vert et que le contraste est faible, c'est souvent la première correction appliquée.

Imagine que tu as un tube de peinture avec 10 teintes de gris, mais que tu n'utilises que 3 d'entre elles. Le résultat est terne. L'égalisation, c'est comme redistribuer tes coups de pinceau pour utiliser toutes les 10 teintes de manière équitable. L'image gagne en profondeur et en détail.

En pratique, tu utiliserais cv2.equalizeHist(image) en une seule ligne. Pour un résultat encore meilleur, il existe CLAHE (cv2.createCLAHE()) qui fait une égalisation locale plutôt que globale. Ici on implémente l'algorithme complet avec NumPy pour comprendre la magie derrière cette transformation.

L'algorithme fonctionne en quatre étapes :

1. Calcule l'histogramme de l'image (combien de pixels pour chaque valeur 0-255).
2. Calcule l'histogramme cumulé : pour chaque valeur i, c'est la somme de tous les bins de 0 à i.
3. Normalise l'histogramme cumulé pour que ses valeurs aillent de 0 à 255.
4. Remplace chaque pixel par sa nouvelle valeur dans l'histogramme cumulé normalisé.

La formule de normalisation est :

nouvelle_valeur[i] = round((cdf[i] - cdf_min) / (nb_pixels - cdf_min) * 255)

où cdf est l'histogramme cumulé et cdf_min est la plus petite valeur non nulle du cdf.

Écris une fonction egaliser_histogramme(image_gris) qui prend une image en niveaux de gris (2D, uint8) et renvoie l'image égalisée (2D, uint8).

Exemple :
Si une image a tous ses pixels entre 100 et 110, après égalisation les valeurs seront réparties entre 0 et 255.

Ce que tu devrais voir sur ta machine : une photo sombre ou surexposée retrouve du contraste. Compare l'histogramme avant et après pour voir la différence.

Tests (5/5)

Forme et dtype conserves
import numpy as np
img = np.random.randint(50, 150, (10, 10), dtype=np.uint8)
result = egaliser_histogramme(img)
assert result.shape == img.shape
assert result.dtype == np.uint8
Image uniforme reste stable
import numpy as np
img = np.full((5, 5), 100, dtype=np.uint8)
result = egaliser_histogramme(img)
assert result.shape == (5, 5)
Valeurs entre 0 et 255
import numpy as np
img = np.random.randint(80, 120, (20, 20), dtype=np.uint8)
result = egaliser_histogramme(img)
assert result.min() >= 0
assert result.max() <= 255
Egalisation etend les valeurs
import numpy as np
np.random.seed(42)
img = np.random.randint(100, 110, (50, 50), dtype=np.uint8)
result = egaliser_histogramme(img)
assert result.max() > img.max(), f'Le max devrait augmenter : avant {img.max()}, apres {result.max()}'
Image deja etalee change peu
import numpy as np
img = np.arange(256, dtype=np.uint8).reshape(16, 16)
result = egaliser_histogramme(img)
assert abs(int(result.min()) - 0) <= 1
assert abs(int(result.max()) - 255) <= 1

Indices (3 disponibles)

solution.py