Modifications entre les versions 2 et 18 (s'étendant sur 16 versions)
Version 2 à la date du 2013-04-02 21:41:03
Taille: 2501
Éditeur: roq13-2-78-235-210-46
Commentaire:
Version 18 à la date du 2014-01-27 22:45:45
Taille: 4514
Éditeur: LionelVaux
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
C’est la séance [[1B3]] de la [[http://isn.irem.univ-mrs.fr/|formation]] 2013-2014.

Le but de ce sujet de TP est d’introduire l’utilisation de modules en Python,
à partir de l’exemple de la bibliothèque Pillow :
celle-ci permet de manipuler facilement des fichiers d’images dans des formats variés.
La dernière partie du TP fait le lien avec les algorithmes de tris vus en cours ce matin.
Ligne 3: Ligne 10:
Ce TP utilise la bibliothèque Pillow : voir les [[Manipulation d'image en Python 3|instructions]]. Pour l’installation éventuelle de Pillow, des instructions sont disponibles sur [[Manipulation d'image en Python 3|une page séparée]].
Ligne 7: Ligne 14:
 * [[attachment:../Filtres d’image/tigrenb.png|tigre.png]]  * [[attachment:../Filtres d’image/tigrenb.png|tigrenb.png]]
Ligne 9: Ligne 16:
== Filtres d’image == == Utilisation du module Pillow ==
Ligne 11: Ligne 18:
Cette partie du TP concerne l’algorithmique de l’image.
Plus précisément, on manipulera des images matricielles,
c’est-à-dire représentées par des tableaux de pixels.

On utilise Pillow pour s’affranchir de la question des formats de fichiers.

=== Ouverture et enregistrement de fichiers d’image avec Pillow ===
=== Ouverture et conversion de fichiers ===
Ligne 20: Ligne 21:
{{{ {{{#!highlight python
Ligne 22: Ligne 23:
im = Image.open('tigre.jpg')
im.save('tigre.png')
im = Image.open(r'tigre.jpg')
im.save(r'tigre.png')
Ligne 27: Ligne 28:
=== Informations sur une image === Première difficulté : comment expliquer à Python où aller chercher les fichiers ?
Ligne 29: Ligne 30:
Dans un interpréteur Python, essayez :
{{{
{{{#!highlight python
import os
os.chdir('/le/chemin/vers/le/bon/dossier')
}}}

/!\ Le répertoire courant est la base à partir de laquelle le programme cherche un fichier quand on
donne un chemin relatif. C’est différent du chemin de recherche des modules python, qui est
situé dans la variable ``sys.path`` (en fait c’est une liste de chemins). Testez.

=== Obtenir des informations sur les objets Python ===

Dans un interpréteur, essayez successivement :
{{{#!highlight python
Ligne 32: Ligne 44:
im = Image.open('tigre.jpg') help(Image.open)
help(Image)
im = Image.open(r'tigre.jpg')
print(im.format,im.size,im.mode)
help(im.save)
help(im)
print(dir(im))
print(im.save.__doc__)
Ligne 34: Ligne 53:
puis essayez d’utiliser la documentation interne de python
(par exemple via la commande `help` de l’interpréteur) pour
explorer les informations fournies par l’objet image.
Ligne 38: Ligne 54:
Essayez par exemple d’obtenir sa taille. Questions :
 * que se passe-t-il si on oublie la première ligne ? que fait `help(PIL.Image)` ?
 * comment interprétez-vous l’attribut `im.mode` ?
 * comment obtenir la valeur d’un pixel ? quel est la forme du résultat pour une image en couleur ? en niveaux de gris ?
 * comment modifier la valeur d’un pixel ?
 * comment convertir facilement une image couleur en niveaux de gris ?
Ligne 40: Ligne 61:
=== Représentation d’une image en mémoire === === Dessin basique ===
Ligne 42: Ligne 63:
Si `im` est une image chargée avec `PIL.Image.open`,
on accède à ses pixels via la fonction `im.load()` qui renvoie un tableau
''indexé par des couples d’entiers'' (et non pas une matrice au sens python du terme).
Écrivez une fonction `croix(im)` qui dessine une petite croix au centre de
l’image `im`.
Ligne 46: Ligne 66:
Par exemple,
{{{
pixels = im.load()
print(pixels[0,0])
Testez de la manière suivante :
 * sauvez votre script par exemple sous le nom `croix.py`
 * dans un interpréteur, tapez les lignes suivantes :
{{{#!highlight python
from croix import croix
import PIL.Image as Image
im=Image.open(r'tigre.jpg')
croix(im)
im.save(r'tigre_test_croix.png')
Ligne 51: Ligne 76:
renvoie la valeur du pixel en haut à gauche de l’image.
Ligne 53: Ligne 77:
Affichez des pixels de l’image en couleurs, puis de l’image en noir et blanc.
Que remarquez-vous ?
Ajoutez des arguments optionnels à la fonction pour permettre à l’utilisateur de choisir
la taille et la couleur du motif. Ça devrait commencer par quelque chose comme :
{{{#!highlight python
def croix(im, taille=10, couleur=0):
 ...
}}}
Ligne 56: Ligne 84:
=== Modifier une image === === Dessin plus avancé ===
Ligne 58: Ligne 86:
Pour modifier un pixel, on change sa valeur dans le tableau des pixels. Essayez :
{{{
pixels[0,0] = 0
im.save('tigre_mod.png')
Essayez les lignes suivantes :
{{{#!highlight python
from PIL.ImageDraw import Draw
dessin = Draw(im)
l,h = im.size
dessin.line([l//2-10,h//2,l//2+10,h//2])
dessin.line([l//2,h//2-10,l//2,h//2+10])
dessin.ellipse([l//2-8,h//2-8,l//2+8,h//2+8])
im.save(r'test_dessin.png')
Ligne 63: Ligne 96:
Est-ce que ça fonctionne avec l’image en noir et blanc ? Avec celle en couleurs ? Quel est l’effet produit.
Explorez les méthodes de dessin disponible (`help(dessin)`).

== Voir comment on trie ==

=== Prélude ===

Écrivez une fonction `valeurs(nombre)` qui génère une liste de valeurs aléatoires
entre 0 et 255.

Vous aurez besoin de la fonction `randint` du module `random`.

=== Trier avec des bulles ===

Implémentez le tri à bulles vu ce matin.

Écrivez ensuite une fonction `voir_bulles(liste)` qui partant d’une liste
de `n` valeurs à trier, construit une image de largeur `n` :
chaque ligne représente une étape de l’algorithme de tri,
en associant par exemple à chaque valeur `x` un pixel `(x,255-x,0)`.

Combien de lignes faut-il prévoir ?

=== D’autres tris ===

Faites le même travail pour le tri par sélection et/ou par insertion.

C’est la séance 1B3 de la formation 2013-2014.

Le but de ce sujet de TP est d’introduire l’utilisation de modules en Python, à partir de l’exemple de la bibliothèque Pillow : celle-ci permet de manipuler facilement des fichiers d’images dans des formats variés. La dernière partie du TP fait le lien avec les algorithmes de tris vus en cours ce matin.

Préambule

Pour l’installation éventuelle de Pillow, des instructions sont disponibles sur une page séparée.

Avant de commencer, je vous suggère d’aller piocher une image de test pas trop grosse (disons au maximum 1024 pixels dans chaque dimension). À défaut en voilà deux, obtenues à partir d’une photo mise à disposition par Hans Stieglitz sur les Wikimedia commons, et soumise à la licence CC-BY-SA 3.0 :

Utilisation du module Pillow

Ouverture et conversion de fichiers

Le bout de code suivant convertit le fichier tigre.jpg (au format JPEG) en tigre.png (au format PNG) :

   1 import PIL.Image as Image
   2 im = Image.open(r'tigre.jpg')
   3 im.save(r'tigre.png')

Essayez chez vous.

Première difficulté : comment expliquer à Python où aller chercher les fichiers ?

   1 import os
   2 os.chdir('/le/chemin/vers/le/bon/dossier')

/!\ Le répertoire courant est la base à partir de laquelle le programme cherche un fichier quand on donne un chemin relatif. C’est différent du chemin de recherche des modules python, qui est situé dans la variable sys.path (en fait c’est une liste de chemins). Testez.

Obtenir des informations sur les objets Python

Dans un interpréteur, essayez successivement :

   1 import PIL.Image as Image
   2 help(Image.open)
   3 help(Image)
   4 im = Image.open(r'tigre.jpg')
   5 print(im.format,im.size,im.mode)
   6 help(im.save)
   7 help(im)
   8 print(dir(im))
   9 print(im.save.__doc__)

Questions :

  • que se passe-t-il si on oublie la première ligne ? que fait help(PIL.Image) ?

  • comment interprétez-vous l’attribut im.mode ?

  • comment obtenir la valeur d’un pixel ? quel est la forme du résultat pour une image en couleur ? en niveaux de gris ?
  • comment modifier la valeur d’un pixel ?
  • comment convertir facilement une image couleur en niveaux de gris ?

Dessin basique

Écrivez une fonction croix(im) qui dessine une petite croix au centre de l’image im.

Testez de la manière suivante :

  • sauvez votre script par exemple sous le nom croix.py

  • dans un interpréteur, tapez les lignes suivantes :

   1 from croix import croix
   2 import PIL.Image as Image
   3 im=Image.open(r'tigre.jpg')
   4 croix(im)
   5 im.save(r'tigre_test_croix.png')

Ajoutez des arguments optionnels à la fonction pour permettre à l’utilisateur de choisir la taille et la couleur du motif. Ça devrait commencer par quelque chose comme :

   1 def croix(im, taille=10, couleur=0):
   2         ...

Dessin plus avancé

Essayez les lignes suivantes :

   1 from PIL.ImageDraw import Draw
   2 dessin = Draw(im)
   3 l,h = im.size
   4 dessin.line([l//2-10,h//2,l//2+10,h//2])
   5 dessin.line([l//2,h//2-10,l//2,h//2+10])
   6 dessin.ellipse([l//2-8,h//2-8,l//2+8,h//2+8])
   7 im.save(r'test_dessin.png')

Explorez les méthodes de dessin disponible (help(dessin)).

Voir comment on trie

Prélude

Écrivez une fonction valeurs(nombre) qui génère une liste de valeurs aléatoires entre 0 et 255.

Vous aurez besoin de la fonction randint du module random.

Trier avec des bulles

Implémentez le tri à bulles vu ce matin.

Écrivez ensuite une fonction voir_bulles(liste) qui partant d’une liste de n valeurs à trier, construit une image de largeur n : chaque ligne représente une étape de l’algorithme de tri, en associant par exemple à chaque valeur x un pixel (x,255-x,0).

Combien de lignes faut-il prévoir ?

D’autres tris

Faites le même travail pour le tri par sélection et/ou par insertion.

WikISN: Des images et des bulles (dernière édition le 2014-01-27 22:45:45 par LionelVaux)