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.
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 pixels | 7 | 9 | 6 | 3 |
L’histogramme de l'image représente la distribution des niveaux de gris de l’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 :
Valeur | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Nombre |
Valeur | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Nombre |
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 :
L'histogramme de départ :
L'histogramme déplacé vers la gauche :
L'histogramme étendu vers la droite :