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

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Calculer l'histogramme d'une image

Les radiologues utilisent les histogrammes pour analyser la qualité d'une radio médicale. En photographie, c'est ce que tu vois sur l'écran de ton appareil ou dans Lightroom pour savoir si ta photo est trop sombre ou trop claire. En vision par ordinateur, l'histogramme est ton premier outil de diagnostic : avant de traiter une image, tu regardes son histogramme pour comprendre sa distribution de luminosité.

Pense à un sondage dans une école. Tu demandes à chaque élève sa note (de 0 à 255), et tu comptes combien d'élèves ont eu chaque note. Si tout le monde a entre 10 et 30, la classe est faible. Si les notes sont réparties de 0 à 255, il y a de tout. L'histogramme d'une image, c'est exactement ça : un comptage de combien de pixels ont chaque niveau d'intensité.

En pratique, tu utiliserais cv2.calcHist([image], [0], None, [256], [0, 256]) pour calculer l'histogramme d'une image. Ici on le fait avec NumPy pour bien comprendre ce que représente chaque valeur.

Un histogramme est un tableau de 256 valeurs. L'élément à l'index i représente le nombre de pixels qui ont la valeur i. Une image sous-exposée (trop sombre) a son histogramme concentré à gauche. Une image surexposée (trop claire) l'a concentré à droite. Une image bien exposée a un histogramme bien réparti.

Écris une fonction calculer_histogramme(image_gris) qui prend une image en niveaux de gris (array 2D, dtype uint8) et renvoie un dictionnaire avec :
'histogramme' : un array NumPy de 256 éléments contenant le nombre de pixels pour chaque intensité
'intensite_moyenne' : la moyenne des intensités (float)
'intensite_min' : la valeur minimale (int)
'intensite_max' : la valeur maximale (int)

Exemple :
img = np.zeros((10, 10), dtype=np.uint8) # 100 pixels noirs
result = calculer_histogramme(img)
result['histogramme'][0] vaut 100
result['intensite_moyenne'] vaut 0.0

Ce que tu devrais voir sur ta machine : utilise matplotlib.pyplot.bar(range(256), histogramme) pour afficher l'histogramme d'une vraie photo en niveaux de gris.

Tests (5/5)

Image noire
import numpy as np
img = np.zeros((10, 10), dtype=np.uint8)
result = calculer_histogramme(img)
assert result['histogramme'][0] == 100
assert result['intensite_moyenne'] == 0.0
assert result['intensite_min'] == 0
assert result['intensite_max'] == 0
Image blanche
import numpy as np
img = np.full((5, 5), 255, dtype=np.uint8)
result = calculer_histogramme(img)
assert result['histogramme'][255] == 25
assert result['intensite_moyenne'] == 255.0
Histogramme a 256 bins
import numpy as np
img = np.zeros((3, 3), dtype=np.uint8)
result = calculer_histogramme(img)
assert len(result['histogramme']) == 256, f'L histogramme doit avoir 256 bins, obtenu {len(result["histogramme"])}'
Image avec deux valeurs
import numpy as np
img = np.zeros((4, 4), dtype=np.uint8)
img[0:2, :] = 100
result = calculer_histogramme(img)
assert result['histogramme'][0] == 8
assert result['histogramme'][100] == 8
assert result['intensite_min'] == 0
assert result['intensite_max'] == 100
Moyenne correcte
import numpy as np
img = np.array([[0, 100], [100, 200]], dtype=np.uint8)
result = calculer_histogramme(img)
assert result['intensite_moyenne'] == 100.0, f'Moyenne attendue 100.0, obtenue {result["intensite_moyenne"]}'

Indices (3 disponibles)

solution.py