TD 6 - Traitement d`images - Site mathématique de Vincent Rohart

publicité
INFORMATIQUE
TD n°6
Traitement d’images
PSI P2-A,B
Année 2016/17
Table des matières
1 Préambule
1.1 Modules Python utilisés sous PyZo dans ce TD . . . . . . . . . . . . . .
1.2 Description d’un fichier image avec imageio . . . . . . . . . . . . . . . .
2
2
2
2 Niveaux de gris
3
3 Questions
3
Vincent Rohart
1
Préambule
1.1
Modules Python utilisés sous PyZo dans ce TD
• imageio.
• numpy (renommé np).
• matplotlib.pyplot (renommé plt).
• os (pour manipuler les fichiers et indiquer le répertoire courant).
1.2
Description d’un fichier image avec imageio
Télécharger l’image tete.jpg mise en ligne avec l’énoncé du TD n°6 et la placer dans
le même répertoire que votre programme python.
Figure 1 – Tête d’une basse de viole.
La commande imread(’tete.jpg’) renvoie un tableau à 3 dimensions, c’est-à-dire
une matrice (appelée ici im) dont chaque élément est lui-même un vecteur, à 3 (ou 4) coefficients. Chaque élément de cette matrice correspond à un pixel de l’image, et contient
les luminances dans les 3 canaux : R, V, B (entiers entre 0 et 255).
On peut avoir accès aux informations (tailles, etc.) de ce tableau :
im = imageio . imread ( ’ t e t e . j p g ’ )
im . shape # ou imageo . shape ( im )
im . shape [ 0 ] ∗ im . shape [ 1 ] # c ’ e s t l e nombre de p i x e l s !
im [ 0 , 0 ] # c ’ e s t l e p r e m i e r p i x e l de l ’ image im
plt . imshow(im) # pour a f f i c h e r l ’ image dans une f e n ê t r e
Attention.
Le pixel (0,0) de l’image est en haut à gauche (comme pour une matrice).
2
Inversement, à partir d’un tableau numpy de cette forme, on peut créer :
• une figure à l’aide de la fonction figure de pyplot ; elle va apparaître dans une
fenêtre graphique sur appel avec la fonction imshow de pyplot.
• une nouvelle image qui sera stockée dans un fichier d’images grâce à la fonction
imsave de la imageio (et qui pourra être visualisée par une visionneuse d’images).
2
Niveaux de gris
Un pixel est une 3-liste [R, V, B] dont les éléments sont des entiers compris entre 0
et 255 (codé sur un octet, d’où le nom du type : uint8).
Un pixel de la forme [m, m, m] sera coloré dans un niveau de gris (m = 0 correspond
au noir et m = 255 correspond au blanc).
Pour transformer une image en couleurs en niveau de gris, on prendra m =
3
R+V +B
.
3
Questions
1. Créer une fonction decomp qui prend une image et renvoie les trois listes LR , LV ,
LB des entiers codant les couleurs R, V, B.
2. Afficher l’image sans sa composante rouge (mettre 0 en lieu et place des entiers
codant les nuances de rouges).
3. Rédiger un programme python transformant une image en couleur en niveau de
gris. On appliquera ce résultat à l’image mise en ligne.
4. Créer une fonction reduction(im, p) qui réduit la taille d’une image im en ne
sélectionnant qu’une ligne sur p. Afficher le résultat avec l’image mise en ligne.
5. Afficher, après avoir écrit un programme python, l’image mise en ligne retournée
de 180°.
6. Faites en sorte que la tête de viole soit verticale.
7. Programmer une fonction inverser s’appliquant à une image en nuances de gris
qui inverse les niveau de gris (le noir devient blanc et réciproquement). Afficher le
résultat.
8. Rapprochement des extrêmes : toujours sur une image en nuances de gris, remplacer chaque pixel [m, m, m] par [m0 , m0 , m0 ] avec m0 = |m − 127|. Interpréter
3
graphiquement et afficher le résultat.
9. Filtrage. Remplacer chaque entier m d’un pixel [m, m, m] d’une image en nuances
de gris par sa moyenne (arrondi à l’entier près) des pixels qui lui sont voisins (il y
en a donc 9 en général, sauf pour les pixels de bord).
4
Téléchargement