Skip to article frontmatterSkip to article content

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

N’oubliez pas d’utiliser le help en cas de problème.

import des librairies

  1. Importez la librairie numpy

  2. Importez la librairie matplotlib.pyplot
    ou toute autre librairie d’affichage que vous aimez et/ou savez utiliser seaborn...

# votre code
  1. 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)

Exercices

  1. 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
  1. Transformez le en tableau blanc (en un seul slicing) et affichez-le
# votre code
  1. Transformez le en tableau vert (en un seul slicing) et affichez-le
# votre code
  1. Affichez les valeurs RGB du premier pixel de l’image, et du dernier
# votre code
  1. Faites un quadrillage d’une ligne bleue, toutes les 10 lignes et colonnes et affichez-le
# votre code

lecture d’une image en couleur

  1. Avec la fonction plt.imread lisez le fichier data/les-mines.jpg
    ou toute autre image - faites juste attention à la taille
# votre code
  1. Vérifiez si l’objet est modifiable avec im.flags.writeable
    si il ne l’est pas copiez-le
# votre code
  1. Affichez l’image
# votre code
  1. Quel est le type de l’objet créé ?
# votre code
  1. Quelle est la dimension de l’image ?
  2. Quelle est la taille de l’image en hauteur et largeur ?
# votre code
  1. Quel est le nombre d’octets utilisé par pixel ?
  2. Quel est le type des pixels ?
    (deux types pour les pixels: entiers non-signés 8 bits ou flottants sur 64 bits)
# votre code
  1. Quelles sont ses valeurs maximale et minimale des pixels ?
# votre code
  1. Affichez le rectangle de 10 x 10 pixels en haut de l’image
# votre code

accès à des parties d’image

  1. Relire l’image
# votre code
  1. 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]

# votre code
  1. Isoler le rectangle de l lignes et c colonnes en milieu d’image
    affichez-le pour (l, c) = (10, 20)) puis (l, c) = (100, 200))
# votre code
  1. Affichez le dernier pixel de l’image
# votre code

canaux rgb de l’image

  1. Relire l’image
# votre code
  1. Découpez l’image en ses trois canaux Red, Green et Blue
# votre code
  1. 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 table

    • donc pour afficher des pixel avec les 3 valeurs RGB pas besoin de tables de couleurs
      on a la couleur

    • mais pour afficher une image unidimensionnelle contenant des nombres de 0 à 255
      il faut bien lui dire à quoi correspondent les valeurs
      (lors de l’affichage, le 255 des rouges n’est pas le même 255 des verts)

    • donner le paramètre cmap= à plt.imshow, 'Reds', 'Greens' ou 'Blues'

# votre code
  1. Corrigez vos affichages si besoin
# votre code
  1. 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
  1. enfin affichez les 20 dernières lignes et colonnes du carré à rayures
# votre code

transparence des images

  1. Relire l’image initiale (sans la copier)
# votre code
  1. 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
  1. Copiez-y l’image initiale, mettez le quatrième canal à 128 et affichez l’image
# votre code

image en niveaux de gris en float

  1. Relire l’image data/les-mines.jpg
# votre code
  1. Passez ses valeurs en flottants entre 0 et 1 et affichez-la
# votre code
  1. 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 formule
    G = 0.299 * R + 0.587 * V + 0.114 * B
# votre code
  1. Passez au carré les pixels et affichez l’image
# votre code
  1. Passez en racine carré les pixels et affichez-la
# votre code
  1. 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)
<Figure size 640x480 with 6 Axes>

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

  1. Affichez les trois images côte à côte
    1 2 3
  1. Affichez-les en damier:
    1 2 3
    3 1 2
    2 3 1
# votre code