Luminosité et Contraste#

Lors de la visualisation d’images dans les notebooks Jupyter, il est important de les afficher de manière à ce qu’un lecteur puisse voir ce dont nous parlons. Par conséquent, l’ajustement de la luminosité et du contraste est important. Nous pouvons le faire en modifiant la plage d’affichage, la gamme des valeurs de gris affichées.

À des fins de démonstration, nous utilisons l’image d’exemple cells3d de scikit-image.

import numpy as np
import matplotlib.pyplot as plt
from skimage.data import cells3d

Le jeu de données cells3d est une image 4D. En utilisant l’accès au tableau, nous extrayons une seule tranche 2D et la montrons.

image = cells3d()[30,0]
image.shape
(256, 256)
plt.imshow(image, cmap='gray')
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x1b3bba94a90>
../_images/2bcb7875f1dce717e64697cb1aa61f9616cc35dacc923f4b6b73722dd4a2b022.png

Notez qu’ici la barre de couleur va de 0 à environ 45000. La fonction plt.imshow() de matplotlib ajuste le contraste de l’image aux valeurs minimales et maximales.

Les valeurs minimales et maximales des pixels peuvent également être obtenues comme ceci :

min_value = image.min()
max_value = image.max()
print('min value = ', min_value)
print('max value = ', max_value)
min value =  277
max value =  44092

Si nous voulons augmenter la luminosité, c’est-à-dire la perception que l’image émet plus de lumière, nous pouvons configurer la plage d’affichage en définissant son minimum vmin et son maximum vmax. Cela améliore la visibilité des membranes.

plt.imshow(image, cmap='gray', vmax=10000)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x1b3bbb1dbb0>
../_images/8149ed3beb84e89872d2c2a89cb66f0e39ee1a57892f2d236e37239c0af8b187.png

Ajustement de la visualisation indépendamment de l’image spécifique#

La prochaine image que nous ouvrirons peut, ou non, avoir une plage de valeurs de gris similaire. Par conséquent, nous pourrions inspecter l’histogramme de l’image et deviner manuellement un meilleur seuil.

plt.hist(image.ravel())
(array([5.8622e+04, 5.6930e+03, 9.7800e+02, 1.6900e+02, 5.5000e+01,
        1.0000e+01, 5.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00]),
 array([  277. ,  4658.5,  9040. , 13421.5, 17803. , 22184.5, 26566. ,
        30947.5, 35329. , 39710.5, 44092. ]),
 <BarContainer object of 10 artists>)
../_images/d44ffd39ecd6ea006e2fb16e609b9cb0089641b9a1b5f471f9d83a108305e746.png

Les histogrammes d’images sont souvent affichés avec une échelle logarithmique.

plt.hist(image.ravel(), log=True)
(array([5.8622e+04, 5.6930e+03, 9.7800e+02, 1.6900e+02, 5.5000e+01,
        1.0000e+01, 5.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00]),
 array([  277. ,  4658.5,  9040. , 13421.5, 17803. , 22184.5, 26566. ,
        30947.5, 35329. , 39710.5, 44092. ]),
 <BarContainer object of 10 artists>)
../_images/390cc18dcf90c400508434856b86afeef6268377c02979413dacdb4cf315d66d.png

Évidemment, cette image a beaucoup de valeurs de gris foncé (< 20000) et peu de valeurs > 40000.

Il pourrait être judicieux de configurer la visualisation en utilisant un pourcentage. Supposons que nous voulions visualiser l’image de manière à ce que 95% des pixels soient dans la plage. Nous pouvons le faire en utilisant la méthode percentile de numpy. Nous reviendrons également sur les percentiles à la fin du semestre.

upper_limit = np.percentile(image, 95)
upper_limit
6580.0
plt.imshow(image, cmap='gray', vmax=upper_limit)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x1b3bd17e670>
../_images/900b83be2052164812a59f814411961e6a79a3a890adfb8b7041a4b0e79bb58b.png

Exercice#

Le jeu de données cells3d contient un autre canal montrant les noyaux des cellules. Visualisez-le de manière à ce que 99% des valeurs de gris inférieures soient correctement visualisées.

nuclei = cells3d()[30,1]
nuclei.shape
(256, 256)