merci à Wikipedia et à stackoverflow
vous n’allez pas faire ici de traitement d’image
on se sert d’images pour égayer des exercices avec numpy
(et parce que quand on se trompe: on le voit)
Notions intervenant dans ce TP
- création, indexation, slicing, modification de
numpy.ndarray
- affichage d’image (RBG, RGB-A, niveaux de gris)
- lecture de fichier
jpg
- les autres notions utilisées sont rappelées (très succinctement)
N’oubliez pas d’utiliser le help en cas de problème.
import des librairies¶
Importez la librairie
numpy
Importez la librairie
matplotlib.pyplot
ou toute autre librairie d’affichage que vous aimez et/ou savez utiliserseaborn
...
# votre code
- optionnel - changez la taille par défaut des figures matplotlib par exemple choisissez d’afficher les figures dans un carré de 4x4 (en théorie ce sont des inches)
création d’une image de couleur¶
Rappels (rapides)
- dans une image en couleur, les pixels sont représentés par leurs dosages dans les 3 couleurs primaires:
red
,green
,blue
(RGB) - si le pixel vaut
(r, g, b) = (255, 0, 0)
, il ne contient que de l’information rouge, il est affiché comme du rouge - l’affichage à l’écran, d’une image couleur
rgb
, utilise les règles de la synthèse additive(r, g, b) = (255, 255, 255)
donne la couleur blanche(r, g, b) = (0, 0, 0)
donne la couleur noire(r, g, b) = (255, 255, 0)
donne la couleur jaune ...

- pour afficher le tableau
im
comme une image, utilisez:plt.imshow(im)
- pour afficher plusieurs images dans une même cellule de notebook faire
plt.show()
après chaqueplt.imshow(...)
Exercices
- Créez un tableau de 91 pixels de côté, d’entiers non-signés 8 bits et affichez-le
indices:
. le tableau n’est pas forcément initialisé à ce stade
. il vous faut pouvoir stocker 3 uint8 par pixel pour ranger les 3 couleurs
# votre code
- Transformez le en tableau blanc (en un seul slicing) et affichez-le
# votre code
- Transformez le en tableau vert (en un seul slicing) et affichez-le
# votre code
- Affichez les valeurs RGB du premier pixel de l’image, et du dernier
# votre code
- Faites un quadrillage d’une ligne bleue, toutes les 10 lignes et colonnes et affichez-le
# votre code
lecture d’une image en couleur¶
- Avec la fonction
plt.imread
lisez le fichierdata/les-mines.jpg
ou toute autre image - faites juste attention à la taille
# votre code
- Vérifiez si l’objet est modifiable avec
im.flags.writeable
si il ne l’est pas copiez-le
# votre code
- Affichez l’image
# votre code
- Quel est le type de l’objet créé ?
# votre code
- Quelle est la dimension de l’image ?
- Quelle est la taille de l’image en hauteur et largeur ?
# votre code
- Quel est le nombre d’octets utilisé par pixel ?
- Quel est le type des pixels ?
(deux types pour les pixels: entiers non-signés 8 bits ou flottants sur 64 bits)
# votre code
- Quelles sont ses valeurs maximale et minimale des pixels ?
# votre code
- Affichez le rectangle de 10 x 10 pixels en haut de l’image
# votre code
accès à des parties d’image¶
- Relire l’image
# votre code
- Slicer et afficher l’image en ne gardant qu’une ligne et qu’une colonne sur 2, 5, 10 et 20
(ne dupliquez pas le code)
[indices]
- vous pouvez créer plusieurs figures depuis une seule cellule
- vous pouvez ensuite choisir de ‘replier’ ou non la zone output en hauteur;
c’est-à-dire d’afficher soit toute la hauteur, soit une zone de taille fixe avec une scrollbar pour naviguer
pour cela cliquez dans la marge gauche de la zone output
# votre code
- Isoler le rectangle de
l
lignes etc
colonnes en milieu d’image
affichez-le pour(l, c) = (10, 20)
) puis(l, c) = (100, 200)
)
# votre code
- Affichez le dernier pixel de l’image
# votre code
canaux rgb de l’image¶
- Relire l’image
# votre code
- Découpez l’image en ses trois canaux Red, Green et Blue
# votre code
Afficher chaque canal avec
plt.imshow
La couleur est-elle la couleur attendue ?
Si oui très bien, si non que se passe-t-il ?rappel table des couleurs
RGB
représente directement l’encodage de la couleur du pixel
et non un indice dans une tabledonc pour afficher des pixel avec les 3 valeurs RGB pas besoin de tables de couleurs
on a la couleurmais pour afficher une image unidimensionnelle contenant des nombres de
0
à255
il faut bien lui dire à quoi correspondent les valeurs
(lors de l’affichage, le255
des rouges n’est pas le même255
des verts)donner le paramètre
cmap=
àplt.imshow
,'Reds'
,'Greens'
ou'Blues'
# votre code
- Corrigez vos affichages si besoin
# votre code
- Copiez l’image, remplacer dans la copie, un carré de taille
(200, 200)
en bas à droite
. par un carré de couleur RGB avec R à 219, G à 112 et B à 147 (vous obtenez quelle couleur)
. par un carré blanc avec des rayures horizontales rouges de 1 pixel
# votre code
- enfin affichez les 20 dernières lignes et colonnes du carré à rayures
# votre code
transparence des images¶
- Relire l’image initiale (sans la copier)
# votre code
- Créez un tableau vide de la même hauteur et largeur que l’image, du type de l’image initiale, avec un quatrième canal
# votre code
- Copiez-y l’image initiale, mettez le quatrième canal à
128
et affichez l’image
# votre code
image en niveaux de gris en float
¶
- Relire l’image
data/les-mines.jpg
# votre code
- Passez ses valeurs en flottants entre 0 et 1 et affichez-la
# votre code
- Transformer l’image en deux images en niveaux de gris :
a. en mettant pour chaque pixel la moyenne de ses valeurs R, G, B
b. en utilisant la correction ‘Y’ (qui corrige le constrate) basée sur la formuleG = 0.299 * R + 0.587 * V + 0.114 * B
# votre code
- Passez au carré les pixels et affichez l’image
# votre code
- Passez en racine carré les pixels et affichez-la
# votre code
- Convertissez l’image de niveaux de gris en type entier non-signé 8 bits et affichez la
en niveaux de gris
# votre code
affichage grille de figures¶
Affichage en matplotlib.pyplot
de plusieurs figures sur une grille
1) on créé une figure globale et des sous-figures
les sous-figures sont appelées axes
par convention matplotlib
on construit notre grille ici de 2 lignes et 3 colonnes
fig, axes = plt.subplots(2, 3)
print(type(axes))
print(axes.shape)
les cases pour les sous-figures sont ici dans la variable axes
qui est un numpy.ndarray
de taille 2 lignes et 3 colonnes
2) on affiche des sous-figure dans des cases de la grille
x = np.linspace(0, 2*np.pi, 50)
axes[0, 0].plot(x, np.sin(x), 'b')
axes[0, 1].plot(x, np.sin(x), 'r')
axes[0, 2].plot(x, np.sin(x), 'y')
axes[1, 0].plot(x, np.sin(x), 'k')
axes[1, 1].plot(x, np.sin(x), 'g')
axes[1, 2].plot(x, np.sin(x), 'm')
3) on peut faire un peu de cosmétique mais
quand on commence on ne s’arrête plus et on perd beaucoup de temps
préférez au début des affichages minimalistes à peu près lisibles
fig.suptitle("sinus en couleur", fontsize=20) # titre général
axes[0, 0].set_title('sinus bleu') # titre d'une sous-figure
axes[0, 2].set_xlabel('de 0 à 2 pi') # label des abscisses
axes[1, 1].set_ylabel('de -1 à 1') # label d'ordonnées
axes[1, 2].set_title('sinus magenta')
plt.tight_layout() # ajustement automatique des paddings
# ce qui nous donne, mis bout à bout
import numpy as np
import matplotlib.pyplot as plt
# le code
fig, axes = plt.subplots(2, 3)
print(type(axes))
print(axes.shape)
x = np.linspace(0, 2*np.pi, 50)
axes[0, 0].plot(x, np.sin(x), 'b')
# axes[0, 1].plot(x, np.sin(x), 'r')
axes[0, 2].plot(x, np.sin(x), 'y')
axes[1, 0].plot(x, np.sin(x), 'k')
axes[1, 1].plot(x, np.sin(x), 'g')
axes[1, 2].plot(x, np.sin(x), 'm')
fig.suptitle("sinus en couleur", fontsize=20)
axes[0, 0].set_title('sinus bleu')
axes[0, 2].set_xlabel('de 0 à 2 pi')
axes[1, 1].set_ylabel('de -1 à 1')
axes[1, 2].set_title('sinus magenta')
plt.tight_layout();
<class 'numpy.ndarray'>
(2, 3)

reprenons le TP¶
Reprenez les trois images en niveau de gris que vous aviez produites ci-dessus:
A: celle obtenue avec la moyenne des rgb
B: celle obtenue avec la correction Y
C: celle obtenue avec la racine carrée
- Affichez les trois images côte à côte
1 2 3
- Affichez-les en damier:
1 2 3
3 1 2
2 3 1
# votre code