HISTOGRAMME
D'UNE PHOTO NUMERIQUE

Mise en situation

Il est possible de créer, en Python, une image en couleurs, en niveaux de gris ou en noir et blanc, à l'aide d'un tableau multidimensionnel. L'image peut alors s'afficher en utilisant une bibliothèque comme Matplotlib. Afin de travailler sur un exemple simple, l'image étudiée sera en niveaux de gris et de petites dimensions.

Le but est de tracer l'histogramme puis de le déformer pour augmenter le contraste de manière optimale. On le décale vers la gauche pour ensuite l'étirer au maximum vers la droite.

Hypothèses et données

Exemple d'histogramme

Soit l’image de 5 pixels par 5 pixels de côté dont les valeurs, codées sur 2 bits, s'échelonnent de 0 à 3.

A chaque valeur de niveau de gris compris entre 0 et 3, on compte le nombre de pixels avec cette valeur :

Valeur de niveau de gris 0 1 2 3
Nombre de pixels7963

L’histogramme de l'image représente la distribution des niveaux de gris de l’image :

Exemple d'image

Le programme en Python ci-dessous crée une image en niveaux de gris dont les valeurs, codées sur 4 bits, s'échelonnent de 0 à 15.

M=[[13,13,12,12,12,11,11,11],
   [13,12,12,12,11,11,11,11],
   [12,12, 8, 8, 7, 6,10,10],
   [12,12, 8, 7, 6, 5,10,10],
   [12,11, 7, 6, 5, 4,10, 9],
   [11,11, 6, 5, 4, 3, 9, 9],
   [11,11,10,10,10, 9, 9, 9],
   [11,10,10,10, 9, 9, 9, 8]]
   
import matplotlib.pyplot as plt
plt.imshow(M,cmap='gray',vmin=0,vmax=15)
plt.show()

Résultat obtenu :

Etude demandée

  1. Pour l'image donnée en exemple, compter les nombres de pixels pour chaque valeur de niveau de gris. Compléter le tableau puis tracer l'histogramme.
  2. Quel pourcentage de pixels de l’image a un niveau de gris supérieur à 7?
  3. Si on applique la fonction y = x-3 à chaque valeur x des pixels de l'image (dit autrement, on enlève 3 à chaque valeur de niveau de gris de l'image) :
  4. On applique la fonction y = 1,5(x-3) en arrondissant le résultat à l'entier le plus proche. Compléter le tableau puis tracer l'histogramme.

Histogramme de départ

Valeur 01 23 45 67 89 1011 1213 1415
Nombre

Histogramme après modification

Valeur 01 23 45 67 89 1011 1213 1415
Nombre

Annexes

Exemples de programmes en Python

Une solution de programme pour modifier l'histogramme.

import matplotlib.pyplot as plt

def voir_image(X):
  plt.imshow(X,cmap='gray',vmin=0,vmax=15)
  plt.show()

def tracer_histogramme(X):
  i=list(range(16))
  j=[0]*16
  for l in X:
    for c in l:
      j[c]+=1
  plt.bar(i, j, width=0.97, color='#ee2255')
  plt.title("Histogramme")
  plt.show()

M=[[13,13,12,12,12,11,11,11],
   [13,12,12,12,11,11,11,11],
   [12,12, 8, 8, 7, 6,10,10],
   [12,12, 8, 7, 6, 5,10,10],
   [12,11, 7, 6, 5, 4,10, 9],
   [11,11, 6, 5, 4, 3, 9, 9],
   [11,11,10,10,10, 9, 9, 9],
   [11,10,10,10, 9, 9, 9, 8]]
voir_image(M)
tracer_histogramme(M)

N=[row[:] for row in M]   # copie de M
for l in range(len(N)):
  for c in range(len(N[l])):
     y=1.5*(N[l][c]-3)
     N[l][c]=min(max(round(y),0),15)
voir_image(N)
tracer_histogramme(N)

Matplotlib permet également d'afficher des images en couleurs.

M=[[[99, 119, 66],[ 92, 112,  59],[ 86, 106,  53],[ 66,  86,  33]],
  [[ 72,  92,  39],[ 99, 120,  64],[109, 130,  74],[106, 127,  71]],
  [[ 54,  74,  21],[ 71,  92,  36],[ 63,  84,  28],[ 71,  92,  36]],
  [[ 58,  79,  23],[ 66,  87,  31],[ 48,  69,  13],[ 55,  76,  20]]]
   
import matplotlib.pyplot as plt
plt.imshow(M)
plt.show()

Résultat obtenu :

Exemple d'évolution d'un histogramme

L'histogramme de départ :

L'histogramme déplacé vers la gauche :

L'histogramme étendu vers la droite :