Differences between revisions 1 and 12 (spanning 11 versions)
Revision 1 as of 2013-12-10 22:56:14
Size: 348
Editor: dra13-2-82-237-244-11
Comment:
Revision 12 as of 2013-12-14 16:02:14
Size: 4219
Editor: dra13-2-82-237-244-11
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= TP : structures de données et images =
Line 2: Line 3:
Un exemple de solution aux exercices se trouve sur la page [[1B2/solution]], mais vous avez intérêt à chercher vous-mêmes, bien entendu!
Line 3: Line 5:
Il s'agit de manipuler à la main un format de fichier: le format d'image [[http://fr.wikipedia.org/wiki/Portable_anymap|PNM]]. Il s'agit de manipuler à la main (en Python) des structures de données pour représenter des images. On va suivre le format d'image [[http://fr.wikipedia.org/wiki/Portable_anymap|PNM]], qui est assez simple pour tout faire soi-même.
Line 7: Line 9:
 * pinklady.ppm, un fichier d'exemple
 * pnm.py, une implémentation des opérations sur ce format (mais le but est de le faire vous-mêmes)
 * [[attachment:pinklady-ascii.ppm]], un fichier d'exemple;
 * [[attachment:pinklady-petit.ppm]], le même en petit format (20 par 20 pixels);
 * [[attachment:pnm_v2.py]], une implémentation de toutes les opérations sur ce format que l'on évoque dans la suite (mais le but est de le faire vous-mêmes).

Vous pouvez utiliser les fonctions définies dans ce fichier en le renommant '''pnm.py''' et en commençant par importer le module:

{{{#!highlight python
import pnm
}}}

== Structure de donnée utilisée ==
On va tout représenter avec les structures de données élémentaires de Python: nombres, chaînes de caractères, listes, dictionnaires.

Une image est représentée par un dictionnaire contenant les entrées suivantes:

 * '''format''' est une chaîne de caractères, dont la valeur peut être
  * ''couleur'' pour une image en couleurs (on utilisera principalement ce cas-là)
  * ''gris'' pour une image en niveaux de gris
  * ''bitmap'' pour une image en noir et blanc
 * '''largeur''' est un entier qui indique le nombre de pixels en largeur
 * '''hauteur''' est un entier qui indique le nombre de pixels en hauteur
 * '''donnees''' est une liste contenant les valeurs des pixels, en fonction du format
  * pour ''couleur'', chaque pixel correspond à 3 valeurs, pour les trois composantes rouge, vert, bleu; le pixel de coordonnées (x,y) commence donc à l'indice (largeur×y+x)×3
  * pour ''gris'', chaque pixel correspond à une valeur qui est son niveau de gris
  * pour ''bitmap'', huit pixels consécutifs correspondent à une valeur du tableau (un bit par pixel)

Le module '''pnm''' fournit en particulier les fonctions suivantes:

 * '''pnm.lire_pnm(nom_fichier)''' lit un fichier et renvoie la structure de données associée
 * '''pnm.afficher_ppm(image)''' affiche une image (supposée être au format ''couleur'') dans une fenêtre Tkinter

Le programme suivant doit afficher l'image d'exemple, en supposant que les deux fichiers sont dans le même répertoire:

{{{#!highlight python
import pnm
i = pnm.lire_pnm("pinklady-ascii.ppm")
pnm.afficher_ppm(i)
}}}

== Exercice 1: rotation de 180° ==

Écrire une fonction '''retourner''' qui prend en argument une image décrite selon la structure ci-dessus et renvoie une nouvelle image qui est la même mais retournée à 180 degrés. On pourra donc voir la pomme retournée en faisant:

{{{#!highlight python
import pnm
avant = pnm.lire_pnm("pinklady-ascii.ppm")
apres = retourner(avant)
pnm.afficher_ppm(apres)
}}}

== Exercice 2: écriture au format PPM ASCII ==

Écrire une fonction '''ecrire_ascii''' qui prend en argument une image et un nom de fichier et produit un fichier au format PPM textuel pour cette image. Pour tester, vous pouvez vérifier que ceci affiche la pomme:

{{{#!highlight python
import pnm
avant = pnm.lire_pnm("pinklady-ascii.ppm")
ecrire_ascii(avant, "test.ppm")
apres = pnm.lire_pnm("test.ppm")
pnm.afficher_ppm(apres)
}}}

== Pour aller plus loin ==

Une fois que vous avez résolu les deux exercices précédents, plusieurs suggestions:

 * Écrire la fonction ''lire_pnm'' qui lit le fichier de l'image et en fait une structure de données acceptable par les autres fonctions. Une solution se trouve dans le fichier fourni, bien entendu, mais elle est plus générale que nécessaire pour l'exercice car elle lit aussi les format PGM (niveaux de gris) et le format PBM (bitmap noir et blanc).
 * Écrire une fonction ''zoom(image, facteur)'' qui effectue un agrandissement ou une réduction de l'image.
 * Écrire une fonction ''rotation(image, angle)'' qui effectue une rotation d'angle arbitraire par rapport au centre de l'image.

TP : structures de données et images

C’est la séance 1B2 de la formation 2013-2014. Un exemple de solution aux exercices se trouve sur la page 1B2/solution, mais vous avez intérêt à chercher vous-mêmes, bien entendu!

Il s'agit de manipuler à la main (en Python) des structures de données pour représenter des images. On va suivre le format d'image PNM, qui est assez simple pour tout faire soi-même.

Pour référence:

  • pinklady-ascii.ppm, un fichier d'exemple;

  • pinklady-petit.ppm, le même en petit format (20 par 20 pixels);

  • pnm_v2.py, une implémentation de toutes les opérations sur ce format que l'on évoque dans la suite (mais le but est de le faire vous-mêmes).

Vous pouvez utiliser les fonctions définies dans ce fichier en le renommant pnm.py et en commençant par importer le module:

   1 import pnm

Structure de donnée utilisée

On va tout représenter avec les structures de données élémentaires de Python: nombres, chaînes de caractères, listes, dictionnaires.

Une image est représentée par un dictionnaire contenant les entrées suivantes:

  • format est une chaîne de caractères, dont la valeur peut être

    • couleur pour une image en couleurs (on utilisera principalement ce cas-là)

    • gris pour une image en niveaux de gris

    • bitmap pour une image en noir et blanc

  • largeur est un entier qui indique le nombre de pixels en largeur

  • hauteur est un entier qui indique le nombre de pixels en hauteur

  • donnees est une liste contenant les valeurs des pixels, en fonction du format

    • pour couleur, chaque pixel correspond à 3 valeurs, pour les trois composantes rouge, vert, bleu; le pixel de coordonnées (x,y) commence donc à l'indice (largeur×y+x)×3

    • pour gris, chaque pixel correspond à une valeur qui est son niveau de gris

    • pour bitmap, huit pixels consécutifs correspondent à une valeur du tableau (un bit par pixel)

Le module pnm fournit en particulier les fonctions suivantes:

  • pnm.lire_pnm(nom_fichier) lit un fichier et renvoie la structure de données associée

  • pnm.afficher_ppm(image) affiche une image (supposée être au format couleur) dans une fenêtre Tkinter

Le programme suivant doit afficher l'image d'exemple, en supposant que les deux fichiers sont dans le même répertoire:

   1 import pnm
   2 i = pnm.lire_pnm("pinklady-ascii.ppm")
   3 pnm.afficher_ppm(i)

Exercice 1: rotation de 180°

Écrire une fonction retourner qui prend en argument une image décrite selon la structure ci-dessus et renvoie une nouvelle image qui est la même mais retournée à 180 degrés. On pourra donc voir la pomme retournée en faisant:

   1 import pnm
   2 avant = pnm.lire_pnm("pinklady-ascii.ppm")
   3 apres = retourner(avant)
   4 pnm.afficher_ppm(apres)

Exercice 2: écriture au format PPM ASCII

Écrire une fonction ecrire_ascii qui prend en argument une image et un nom de fichier et produit un fichier au format PPM textuel pour cette image. Pour tester, vous pouvez vérifier que ceci affiche la pomme:

   1 import pnm
   2 avant = pnm.lire_pnm("pinklady-ascii.ppm")
   3 ecrire_ascii(avant, "test.ppm")
   4 apres = pnm.lire_pnm("test.ppm")
   5 pnm.afficher_ppm(apres)

Pour aller plus loin

Une fois que vous avez résolu les deux exercices précédents, plusieurs suggestions:

  • Écrire la fonction lire_pnm qui lit le fichier de l'image et en fait une structure de données acceptable par les autres fonctions. Une solution se trouve dans le fichier fourni, bien entendu, mais elle est plus générale que nécessaire pour l'exercice car elle lit aussi les format PGM (niveaux de gris) et le format PBM (bitmap noir et blanc).

  • Écrire une fonction zoom(image, facteur) qui effectue un agrandissement ou une réduction de l'image.

  • Écrire une fonction rotation(image, angle) qui effectue une rotation d'angle arbitraire par rapport au centre de l'image.

WikISN: TP format PNM (last edited 2016-03-01 13:25:51 by LionelVaux)