Vincent GODARD - V2- 23/03/2023
Inspiré de :
Sources :
données Landsat Thematic Mapper (TM) du 10 septembre 1987, ouest de Worcester, Massachusetts (issues du https://clarklabs.org/download/)
scikit-image https://scikit-image.org/
matplotlib https://matplotlib.org/
Dossier compressé à télécharger => ici.
Créez dans le répertoire TD11 un sous répertoire "data" où vous déposerez (bouton Upload Files), depuis votre zone de stockage, les fichiers :
- how87tm4_grey.jpg
- h87tm4_grey.jpg
Ce noteboock et le répertoire "data" seront au même niveau dans l'arborescence, tous les deux sous TD11.
Dans le JupyterLab la bibliothèque Matplotlib est déjà installée. Si la bibliothèque skimage ne l'est pas, il faut l'installer.
Il faut ensuite les charger (fonction import).
## Si vous n'avez jamais installé skimage sur votre ordinateur, il est probablement absent des bibliothèques par défaut.
## Pour l'installer, effacez le # (avant le "!").
#!pip install scikit-image
## Import des bibliothèques
import skimage # Bibliothèque de traitement d'images
import skimage.io as io # Utilitaire permettant de lire et d'écrire des images dans différents formats (raccourci en io).
import matplotlib.pyplot as plt # Bibliothèque destinée à tracer et visualiser des données sous forme de graphiques.
## Pour en connaître la version de skimage
skimage.__version__ # attention au "." après skimage
Il se peut que l'import de la version de skimage génère un message d'erreur, comme une incompatibilité avec numpy, par exemple. Une des bibliothèques est trop ancienne par rapport à l'autre. Il faut donc faire une mise à jour.
## SciPy est un projet qui fédère des bibliothèques Python à usage scientifique.
## Scipy utilise les tableaux et matrices du module NumPy (https://fr.wikipedia.org/wiki/SciPy).
## Mise à jour de scipy, effacez le # (avant le "!") si nécessaire.
#!pip install --upgrade scipy
## Ensuite, il faut l'importer
#import scipy
## Puis vérifier que cette nouvelle version est compatible
#scipy.__version__
On pourra avantageusement regarder à quoi servent les bibliothèques https://scikit-learn.org/stable/ ou https://scikit-image.org/ dont il existe parfois des Wiki en français https://fr.wikipedia.org/wiki/Scikit-learn ou https://fr.wikipedia.org/wiki/Scikit-image.
Lecture d'un fichier image centré sur le secteur des Howe Hill, à l'ouest de Worcester dans le Massachusetts (USA). C'est la bande TM4 (PIR, proche infra-rouge) du Landsat Thematic Mapper (TM) du 10 septembre 1987.
## Lecture avec la fonction imread() avant affichage
HOW87TM4 = io.imread('data/how87tm4_grey.jpg')
## Affichage du nb de lignes, de colonnes et du nb de canaux (le cas échéant)
## Utilisation de la fonction .shape du module .io
print(HOW87TM4.shape)
## Si on souhaite habiller la sortie (texte entre '', puis "," avant la fonction .shape sur la variable HOW87TM123)
print('(nb lignes, nb colonnes) :', HOW87TM4.shape)
On peut aussi vouloir connaître la profondeur de notre variable (son codage) par son type.
○ Le type d'un objet Python détermine quel genre d'objet c'est : https://docs.python.org/fr/3/glossary.html#term-type
## Affichage des informations
print( 'type :', HOW87TM4.dtype )
Le type est un entier (unsigned integer 8bits) codé sur un octet (256 niveaux de gris par exemple).
## Affichage de l’image en niveau de gris, en utilisant la fonction imshow() du module plt :
plt.imshow(HOW87TM4, 'gray')
## Pour choisir une autre couleur : https://matplotlib.org/stable/tutorials/colors/colormaps.html
## Écrire n'importe quoi à la place de 'gray', cela génère un message d'erreur !
## À ValueError, dans la liste des couleurs, en essayer d'autres comme :
## 'viridis' (couleur par défaut) ou 'tab20c_r' pour voir l'effet.
## Attention à la casse (MAJ/min) !
## Si l'image apparaît trop petite, on peut définir une dimension de figure où afficher notre image
plt.figure(figsize = (10,10)) # rechercher qui est H et qui est L (mots-clefs : plt.figure figsize)
plt.imshow(HOW87TM4, 'gray')
## Attention à respecter la proportionnalité.
## Pour voir, essayez le paramètre 'aspect' (, aspect='auto')
## Il est en général inadapté en géographie, car déforme les proportions en x et y !
plt.imshow(HOW87TM4, 'gray', aspect='auto')
Il peut être intéressant de ne pas travailler sur l'ensemble d'un fichier, mais plutôt sur une sous région d'intérêt.
## Extraction d'une région d'intérêt (ROI)
ROI = HOW87TM4[360:460, 120:220] # dimension de la sous-fenêtre de 100 par 100 pixels en lignes et colonnes
plt.imshow(ROI, 'gray')
C'est sa description en nombre de lignes et de colonnes.
## Échantillonnage de l'image d'origine tous les 5 pixels
r = HOW87TM4[::5, ::5] # échantillonnage (r = resample) 5x5 sans faire de sous fenêtre
print('(nb lignes, nb colonnes) :', r.shape) # pour afficher la nouvelle taille de l'image
## Pour voir l'effet de l'échantillonnage
plt.imshow(r, 'gray')
## Échantillonnage de l'image d'origine tous les 10 pixels
r = HOW87TM4[::10, ::10] # échantillonnage (r = resample) 10x10 sans faire de sous fenêtre
print('(nb lignes, nb colonnes) :', r.shape) # pour afficher la nouvelle taille de l'image
## Pour voir l'effet de l'échantillonnage
plt.imshow(r, 'gray')
Ici, l'image occupe toujours le même espace mais les pixels qui la composent sont moins nombreux donc plus gros !
La résolution augmente-elle ou diminue-t-elle ?
C'est moins fin, elle diminue !
Que se passe-t-il si vous faites varier la valeur du nombre de lignes et de colonnes indépendamment ?
## Échantillonnage de l'image d'origine tous les x pixels en lignes et y pixels en colonnes
y = 2 # choisissez une valeur de y (lignes)
x = 4 # choisissez une valeur de x (colonnes)
r = HOW87TM4[::y, ::x] # échantillonnage (r = resample) sans faire de sous fenêtre
print('(nb lignes, nb colonnes) :', r.shape) # pour afficher la nouvelle taille de l'image
## Pour voir l'effet de l'échantillonnage
plt.imshow(r, 'gray')
Échantillonnage par itérations (Loop) en utilisant des pas de plus en plus grands sans changer les dimensions d'affichage.
## Échantillonnages successifs aux pas de 1 à 50
## Boucle qui parcourt successivement tous les pas
## Attention aux ":" à la fin de la boucle for.
for s in [1, 2, 3, 4, 5, 10, 20, 50]:
r = HOW87TM4[::s, ::s] # s est le pas d'échantillonnage défini à la ligne du dessus
print(r.shape) # taille de l'image échantillonnée, affichée comme un titre (au-dessus)
plt.imshow(r, 'gray') # affichage de l'effet réducteur sur la définition, en gris
plt.show() # ligne (nécessaire) pour afficher les résultats successifs stockés en mémoire
On constate une dégradation de la résolution. Les pixels grossissent et sont moins nombreux pour un même espace.
## Augmentation puis diminution des dimensions d'affichage (accroissement puis réductions) par pas de 0.5 à 50
for s in [0.5, 1, 2, 3, 4, 5, 10, 20, 50]:
plt.figure(figsize=(8/s, 8/s)) # impact du pas échantillon comme dénominateur sur la taille de la figure
print('Effet zoom pour une valeur de pas échantillon de',s) # valeur de l'échantillon affichée comme un titre (au-dessus)
plt.imshow(HOW87TM4, 'gray') # affichage de l'effet dimensionnel
plt.show() # ligne (nécessaire) pour afficher les résultats successifs stockés en mémoire
Équivalent de la section 4.2 mais, où l'affichage est remplacé par un enregistrement.
## Enregistrements successifs des pas d'échantillonnage allant de 1 à 50
## Boucle qui parcourt successivement tous les pas
## Attention aux ":" à la fin de la boucle for.
for s in [1, 2, 3, 4, 5, 10, 20, 50]:
r = HOW87TM4[::s, ::s] # s est le pas d'échantillonnage défini à la ligne du dessus
io.imsave("data/test{}.png".format(s), r) # enregistrement successif d'images appelées test{s}.png, ou {s} reprend le pas échantillon
Contrôlez dans votre répertoire "data" que des fichiers test{s}.png, ou {s} est remplacé par la valeur d'incrément d'échantillon, sont bien présents.
Leur contenu en pixels est inversement proportionnel à la taille du pas.
Indique le nombre de pixels (tâchels = points) par unité de longueur (ppp, points par pouce ou dpi, dots per inch) sur un support physique (écran, tirage papier...).
## Résolution constante malgré la baisse de la définition (pixellisation) par échantillonnages aux pas de 1 à 50
for s in [1, 2, 3, 4, 5, 10, 20, 50]:
plt.figure(figsize=(8/s, 8/s)) # impact du pas échantillon comme dénominateur sur la taille de la figure
r = HOW87TM4[::s, ::s]
print('Nb de lignes et nb de colonnes',r.shape, 'pour une valeur de pas échantillon de', s)
plt.imshow(r, 'gray')
plt.show()
Sauriez-vous zoomer l'extrait h87tm4_grey.jpg d'un facteur 2 (rappel 0.5), 3 puis 4 ?
Quel est le facteur d'échantillonnage qui fait disparaître l'extrait h87tm4_grey.jpg ?