Seuillage d'une image avec RangeSlider

PythonPythonBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons démontrer comment utiliser le widget RangeSlider dans Matplotlib pour contrôler le seuillage d'une image. Le but du seuillage est de convertir une image en niveaux de gris en une image binaire, où les pixels sont soit noirs soit blancs. Cela est utile pour la segmentation d'images, où nous voulons extraire certaines caractéristiques de l'image.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Générer une image fictive

Tout d'abord, nous allons générer une image en niveaux de gris fictive à l'aide du module random de NumPy. Nous allons définir la graine pour vous assurer que les résultats sont reproductibles.

np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)

Afficher l'image et son histogramme

Ensuite, nous allons afficher l'image à l'aide de la fonction imshow de Matplotlib, et son histogramme à l'aide de hist. Nous allons créer une figure avec deux sous-graphiques, l'un pour l'image et l'autre pour l'histogramme.

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(bottom=0.25)

im = axs[0].imshow(img)
axs[1].hist(img.flatten(), bins='auto')
axs[1].set_title('Histogram of pixel intensities')

Créer le RangeSlider

Nous allons maintenant créer le widget RangeSlider, qui nous permettra de régler le seuil de l'image. Nous allons créer un nouvel axe pour le curseur et l'ajouter à la figure.

slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())

Ajouter des lignes verticales à l'histogramme

Pour faciliter la visualisation de l'effet du seuillage, nous allons ajouter des lignes verticales à l'histogramme pour indiquer les valeurs de seuil actuelles. Nous allons créer deux lignes pour les valeurs de seuil inférieur et supérieur respectivement.

lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')

Créer une fonction de rappel pour le curseur

Nous allons créer une fonction de rappel qui sera appelée chaque fois que l'utilisateur change les valeurs de seuil à l'aide du curseur. La fonction mettra à jour la carte de couleurs de l'image et les positions des lignes verticales sur l'histogramme.

def update(val):
    ## La valeur val passée à un rappel par le RangeSlider sera
    ## un tuple de (min, max)

    ## Mettez à jour la carte de couleurs de l'image
    im.norm.vmin = val[0]
    im.norm.vmax = val[1]

    ## Mettez à jour la position des lignes verticales
    lower_limit_line.set_xdata([val[0], val[0]])
    upper_limit_line.set_xdata([val[1], val[1]])

    ## Redessinez la figure pour vous assurer qu'elle est mise à jour
    fig.canvas.draw_idle()


slider.on_changed(update)

Afficher la figure

Enfin, nous allons afficher la figure avec l'image et le curseur.

plt.show()

Sommaire

Dans ce laboratoire, nous avons démontré comment utiliser le widget RangeSlider dans Matplotlib pour contrôler le seuillage d'une image. Nous avons montré comment créer une image en niveaux de gris fictive, l'afficher ainsi que son histogramme, créer un curseur pour ajuster les valeurs de seuil et mettre à jour l'image et l'histogramme en fonction des valeurs du curseur. Cette technique peut être utilisée pour la segmentation d'images et d'autres applications où nous devons extraire certaines caractéristiques d'une image.