Cours de programmation séquentielle

Traitement d’images

Traitement d’images

Buts

Énoncé

Créer une librairie de manipulation d’images en niveaux de gris. Cette librairie devra permettre d’effectuer les opérations suivantes:

  1. Lecture d’une image au format PGM depuis un format binaire.
  2. Sauvegarde d’une image dans le format PGM binaire.
  3. Effectuer des opérations sur les images:
    1. Symétrie horizontale, verticale, et centrale d’une image.
    2. Un effet photomaton.
    3. Filtre d’une image.
    4. Rogner une image.
    5. Calculer le négatif d’une image.
  4. Visualiser une image PGM obtenue à l’aide de la librairie SDL.

Cahier des charges

Pour ce travail, en plus de la réalisation de la librairie de traitement d’images, vous devez utiliser le logiciel de gestion de version git et évidemment compiler le projet à l’aide d’un Makefile.

Gestion d’erreurs

Un grand nombre des fonctions de ce travail peuvent échouer. Pour simplifier, nous nous limiterons à deux retour possibles du type énuméré pgm_result:

typedef enum _pgm_result {
    success, failure
} pgm_result;

Représentation informatique des images

Dans ce travail pratique, une image n’est rien d’autre qu’une matrice de nombres entiers, au sens de celles que vous avez implémentées au précédent travail pratique. Pour simplifier les images seront uniquement représentées en niveaux de gris. Ainsi chaque élément de la matrice représente un pixel. Les valeurs des pixels devront être limitées entre 0 et une valeur maximale max.

Pour simplifier encore, les images seront supposées être données au format PGM. Le format PGM (portable graymap file format) est un format de fichier très simple permettant de stocker des images en niveau de gris. Nous utiliserons le format PGM binaire. Vous trouverez une définition du format sur la page https://fr.wikipedia.org/wiki/Portable_pixmap.

Une image PGM peut être représentée à l’aide de la structure de données suivante:

typedef struct _pgm {
    int32_t max;
    matrix pixels;
} pgm;

Le format PGM binaire implique la lecture dans un premier temps d’une entête contenant le texte P5 sur la première ligne, puis les dimensions de l’image sur la deuxième ligne. Sur la troisième ligne se trouve le niveau de gris maximal. Ces trois lignes sont en format ASCII. Finalement, les pixels de l’image en format binaire sont stockés dans les lignes restantes. A nouveau pour simplifier, nous supposerons que chaque pixel est un entier non signé d’un octet.

Nous supposerons dans ce travail, pour simplifier, qu’il n’existe pas de commentaires dans les fichier (pas de lignes commençant par #).

Lecture et écriture d’une image PGM en format binaire

Afin de lire et écrire un fichier binaire, il faut utiliser le type pointeur de fichier:

FILE *f;

et les fonctions permettant de manipuler les fichiers:

A l’aide de ces fonctions vous devriez être capables de lire et écrire des fichiers PGM.

Afin de tester vos fonctions vous pouvez utiliser l’image du mandrill (voir fig. 1.1) en cliquant sur ce lien

Figure 1.1: Image d’un mandrill.

Fonctions à implémenter

Il faut implémenter au minimum les fonctions suivantes:

Les transformations d’images

Le négatif

Le négatif d’une image consiste à inverser la valeur des pixels de l’image par rapport à la valeur maximale permise. Ainsi si on représente max niveaux de gris, le négatif d’un pixel de niveau de gris, p, est donné par max-p. Un exemple de négatif de l’image du mandrill se trouve sur la fig. 2.1

Figure 2.1: L’original (image de gauche) et le négatif (image de droite) de la photo du mandrill.

Fonctions à implémenter

Il faut implémenter au minimum la fonction suivante:

Les symétries

Une symétrie verticale ou horizontale consiste à inverser l’ordre des pixels verticalement ou horizontalement respectivement. La symétrie centrale consiste à échanger les lignes et les colonnes d’une image. Vous pouvez voir un exemple de ces trois symétries aux fig. 2.2, fig. 2.3, fig. 2.4

Figure 2.2: Exemple de symétrie horizontale.
Figure 2.3: Exemple de symétrie verticale.