Differences between revisions 4 and 6 (spanning 2 versions)
Revision 4 as of 2013-04-02 21:44:14
Size: 2765
Editor: roq13-2-78-235-210-46
Comment:
Revision 6 as of 2013-04-02 23:00:01
Size: 3518
Editor: roq13-2-78-235-210-46
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
à partir de l’exemple de la bibliothèque Pillow qui permet de manipuler des fichiers d’images dans des formats variés. à partir de l’exemple de la bibliothèque Pillow :
celle-c
i permet de manipuler facilement des fichiers d’images dans des formats variés.
Line 12: Line 13:
== Filtres d’image == == Utilisation du module Pillow ==
Line 14: Line 15:
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 ===
Line 23: Line 18:
{{{ {{{#!highlight python
Line 25: Line 20:
im = Image.open('tigre.jpg')
im.save('tigre.png')
im = Image.open(r'tigre.jpg')
im.save(r'tigre.png')
Line 30: Line 25:
=== Informations sur une image === Première difficulté : comment expliquer à Python où aller chercher les fichiers ?
Line 32: Line 27:
Dans un interpréteur Python, essayez :
{{{
Trouvez dans votre interpréteur la liste des chemins de recherche.

Pour la suite :
 * méthode sale mais rapide : mettez vos fichiers d’images là où Python regarde déjà ;
 * méthode plus propre : ajouter un chemin à la variable `sys.path` (comment ?).

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

Dans un interpréteur, essayez successivement :
{{{#!highlight python
Line 35: Line 38:
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))
Line 37: Line 46:
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.
Line 41: Line 47:
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 obtenir une nouvelle image ?
Line 43: Line 54:
=== Représentation d’une image en mémoire === === Dessin basique ===
Line 45: Line 56:
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`.
Line 49: Line 59:
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
import croix
import PIL.Image as Image
croix(Image.open(r'tigre.jpg')).save(r'tigre_test_croix.png')
Line 54: Line 67:
renvoie la valeur du pixel en haut à gauche de l’image.
Line 56: Line 68:
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):
 ...
}}}
Line 59: Line 75:
=== Modifier une image === === Dessin plus avancé ===
Line 61: Line 77:
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')
Line 66: Line 87:
Est-ce que ça fonctionne avec l’image en noir et blanc ? Avec celle en couleurs ? Quel est l’effet produit.
Explorer les méthodes de dessin disponible (`help(dessin)`).

== Voir comment on trie ==

Vous avez maintenant tous les outils en man

Le but de ce sujet de TP est d’introduire l’utilisation de modules externes 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.

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 ?

Trouvez dans votre interpréteur la liste des chemins de recherche.

Pour la suite :

  • méthode sale mais rapide : mettez vos fichiers d’images là où Python regarde déjà ;
  • méthode plus propre : ajouter un chemin à la variable sys.path (comment ?).

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))

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 obtenir une nouvelle image ?

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 import croix
   2 import PIL.Image as Image
   3 croix(Image.open(r'tigre.jpg')).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')

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

Voir comment on trie

Vous avez maintenant tous les outils en man

WikISN: Des images et des bulles (last edited 2014-01-27 22:45:45 by LionelVaux)