TP 5 : Niveaux de gris et traitement d'images¶

1. Image en niveau de gris¶

  1. Lisez l'image gray_scale.png et stockez la dans la variable tab_pixel avec imread niveauxDeGris.png

  2. Afficher avec print et shape les dimensions de tab_pixel, le nombre de lignes et le nombre de colonnes. Quelle est la différence avec un tableau associé à une image en couleur (RGB) ?

  3. Affichez l'image, (utilisez l'option de imshow cmap='gray'). plt.imshow(tab_pixel, cmap='gray')
In [ ]:
# Chargement des modules nécessaires pour l'exercice 
import matplotlib.pyplot as plt
import numpy as np 
import imageio.v3 as imageio # ou mettre uniquement : import imageio

# Réponse 

1. Image en niveau de gris (suite)¶

  1. En extrayant (i.e. section de tableau) toutes les colonnes de la ligne 50 du tableau tab_pixel, tracez une courbe d'évolution de la valeur des pixels le long de cette ligne horizontale.
    • Vous devez obtenir une courbe de niveaux de gris comme ci-dessous niveauxDeGris.png
  2. Les images en niveaux de gris sont ici codées sur 8 bits c'est à dire à l'aide de $2^8$ valeurs (de 0 à 255) allant du noir au blanc :
    • Affichez la valeur du maximum, la valeur du minimum.
    • A quelle valeur correspond le noir ? le blanc ? les différents niveaux de gris ?
In [ ]:
# Réponse 

2.1 Binarisation d'une image¶

  1. Binarisation à l'aide d'un seuil : On cherche maintenant à reproduire l'image suivante. index.png Tous les pixels d'un niveau de gris sont transformés en noir pur (et blanc pur) si le niveau de gris est plus petit (ou grand) qu'un seuil prélablement défini.
    • On commence par dupliquer la matrice tab_pixel en tab_pixel_bw (en utilisant la fonction numpy copy : tab_pixel_bw = np.copy(tab_pixel) )
    • Fixez un seuil (en analysant la courbe sur les niveaux de gris faite en première partie) et utilisez les logiques avec des tests ($\le$ et $>$) pour la binarisation de cette image.
In [ ]:
# Réponse 

2.2 Calculs sur une image binarisée¶

  1. L'image bw obtenue étant binarisée, il devient facile de faire des mesures sur cette image.

    • Comptez le nombre de pixels blancs et de pixels noirs sur cette image. np.sum()
    • Comptez le nombre de sauts de noir à blanc sur une ligne de la matrice associée à l'image.

Indication : Il faut d'abord convertir la ligne qui contient des entiers en nombres réels avec np.double puis utiliser la fonction numpy np.diff qui fait la différence entre deux valeurs successives d'un tableau. Une valeur non nulle de cette différence détecte le passage noir/blanc ou blanc/noir. Dans ce cas, il n'y a qu'un saut de noir à blanc.

In [ ]:
# Réponse 

3. Application¶

L'objectif est ici de travailler sur une photo réelle. Dans la pratique, les images ne sont pas aussi simples que celles de la partie 2. On est ainsi amené à "retravailler" l'image pour affiner les critères : zone à analyser, réglages des seuils...
Nous observons ici une instabilité de Kelvin Helmholtz. Il s'agit d'un phénomène que l'on observe dans l'atmosphère sous la forme de vagues dans les nuages (zone encadrée en rouge sur la photo ci-dessus). kh

3.1 Découpage d'une image¶

  1. Avec imread, associez l'image KH_2_gray.png au tableau tab_pixel et affichez-la en noir et blanc
  2. Créez un tableau tab_pixel_kh en selectionnant une bande de l'image correspondant à l'instabilité de Kelvin Helmholtz (section de tableau en utilisant les indices des pixels).
In [ ]:
# Réponse 

3.2 Analyse préliminaire de l'image¶

  1. Tracez les niveaux de gris le long d'une ligne horizontale qui "traverse" les vagues.
  2. Binarisez le tableau tab_pixel_kh en noir et blanc en fixant par exemple une valeur seuil de 140 et affichez l'image associée au tableau binarisé. Qu'en pensez-vous ?
In [ ]:
# Réponse 

3.3 Application (suite et fin)¶

  1. Comptez le nombre de vagues en affinant éventuellement la délimitation autour des vagues, la ligne choisie et le seuil. Pensez à faire des plots pour vous guider. Nous mettons ci-dessous deux exemples de plot index.png
In [ ]:
# Réponse