Ce module est préinstallé avec Pyzo.
La bibliothèque "io" (input/output) du module skimage permet de lire un fichier image et de le convertir en tableau numpy en une seule étape
(méthode io.imread()
) et d'afficher l'image (méthodes io.imshow()
et io.show()
).
Quatre lignes de code permettent d'afficher une image :
from skimage import io
pour charger la bibliothèque ionom_variable = io.imread(chemin_fichier)
permet de lire le fichier et de le convertir en tableau numpyio.imshow(nom_variable)
(affichage étape 1)io.show()
(affichage étape 2)Les caractéristiques d'une image sont contenues dans les attributs shape
et dtype
.
L’attribut shape contient un tuple de la forme :
- (hauteur, largeur) pour une image en niveaux de gris ;
- (hauteur, largeur, n) pour une image couleur.
Où n est un entier :
- n = 3 correspond au codage r, g, b ;
- n = 4 correspond au codage r, g, b, alpha.
L'attribut dtype (data type) contient le codage des pixels de l'image (par exemple, "uint8" = Unsigned integer (0 to 255)).
La conversion de l’image en tableau numpy permet de nombreuses manipulations, modifications de pixels, inversions (retournements), rotation à 90°, extraction de régions par slicing, redimensionnement, traitement des couleurs mais également des opérations beaucoup plus complexes (cf. par exemple scikit-image).
Le traitement de l'image nécessite donc des connaissances sur les tableaux numpy.
Il est impératif de sauvegarder régulièrement le code en le collant dans un fichier texte (Notepad++) ou dans l'éditeur de pyzo.
Exemple d'utilisation du module skimage et sa bibliothèque io (imput / output).
L'image utilisée est le logo de wikipédia accessible en ligne.
Fonctionne avec Pyzo. Privilégier la méthode d'affichage de l'exemple 2 sur ce site.
Dans cet exemple, on utilise matplotlib.pyplot pour afficher l'image au lieu de io.
Fonctionne avec Pyzo. Afficher les images avec cette méthode (plt.imshow et plt.show au lieu de io.imshow et io.show) sur ce site.
Il est nécessaire de placer une instruction plt.clf() (clear figure) avant plt.imshow sous peine de voir plusieurs images superposées.
cmap
signifie color map (table de couleur), dans le code ci-dessous l'instruction cmap = "gray"
permet d'afficher l'image en niveaux de gris
(facultatif avec pyzo).
Rappel : "unpacking"
1.1 Afficher l'image disponible à l'adresse suivante : http://gilles.django.group/static/images/240px-Rubik_cube.png.
1.2 Déterminer ses caractéristiques : dimensions, type de codage (dtype), codage des pixels (attention, image en couleur donc shape renvoie 3 valeurs et non 2).
1.3 Vérifier que la couleur du pixel situé en (150, 120) est bien compatible avec la couleur prévisible (valeurs RGB).
Rq : dans Pyzo, un réticule est disponible ; il permet de visualiser les coordonnées d'un point.
1.4 Tester l'instruction suivante :
rubik[100:150, 100:150] = [0,0,0,255]
(afficher à nouveau l'image). Puis faites vos propres essais.
Objectif : écrire des fonctions permettant de réaliser des symétries verticales, horizontales, de faire tourner l'image...
Pour créer un tableau "vide" ayant les caractéristiques d'une image en couleurs codée RGBA (donc 4 valeurs), on peut utiliser :
T = np.zeros((nombre_lignes, nombre_colonnes, 4), dtype=np.uint8)
.
Fichier original (jpg) : Ting Chen, CC BY 2.0, via Wikimedia Commons
2.1 Afficher l'image disponible à l'adresse suivante : http://gilles.django.group/static/images/oiseau.png et déterminer ses caractéristiques.
2.2 Ecrire une fonction symVer(Tab) renvoyant un tableau T correspondant à une inversion gauche/droite du tableau Tab (la fonction crée un tableau vide T puis le remplit pixel par pixel).
Tester avec l'image précédente.
2.3 Ecrire une fonction symHor(Tab) renvoyant un tableau T correspondant à une inversion haut/bas du tableau Tab.
2.4 Ecrire une fonction symDiag(Tab) renvoyant un tableau T correspondant à une transposition du tableau Tab (matrice transposée).
2.5 En utilisant deux des fonctions précédentes, montrer qu'il est possible de faire tourner l'image de 90 degrés.
2.6 Ecrire un fonction chimere(Tab) renvoyant un tableau construit en remplissant la moitié du tableau avec l'image originale et l'autre moitié avec son symétrique (de façon à obtenir par exemple une chimère à deux têtes...).
3.1 Quel travail la fonction r(T) ci-dessous effectue-t-elle sur l'image ?
Que deviennent les carrés bleus ou verts de l'image initiale dans l'image finale ? Pourquoi ?
Pourquoi est-il impossible de distinguer les carrés rouges des carrés blancs de l'image initiale dans l'image finale ?
3.2 Ecrire une fonction NB1(T) transformant l’image initiale T en image en niveaux de gris.
Dans cette première tentative de conversion, on utilise la formule suivante pour créer un niveau de gris à partir d'un pixel (r,g,b,a) :
gris = min(255, (r+g+b)//3)
. Expliquer ce choix.
Veiller à conserver la couche alpha lors de la modification des pixels (comme dans la fonction précédente).
3.3 Ecrire une fonction NB2(T) transformant l’image initiale T en image en niveaux de gris en tenant compte de la sensibilité de l'œil grâce à la fonction suivante :
grisOeil(red,green,blue) = int(round(0.299*red + 0.587*green + 0.114*blue))