diff --git a/traitement_dimages.md b/traitement_dimages.md index 6ed04d1672e621898e4e2e2d86632c623d37981d..20b2576540b882f7e214ec24f15d10fa15d23364 100644 --- a/traitement_dimages.md +++ b/traitement_dimages.md @@ -35,7 +35,7 @@ toc: false 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'un image au format PGM depuis un format binaire. +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. @@ -70,7 +70,7 @@ pratique. Pour simplifier les images seront uniquement représentées en *niveau 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 les images seront supposées être données en format PGM. Le format PGM (portable graymap file format) +Pour simplifier encore, les images seront supposées être données <audio></audio> 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 @@ -135,7 +135,7 @@ maximale permise. Ainsi si on représente `max` niveaux de gris, le négatif d'u Il faut implémenter **au minimum** la fonction suivante: -* la fonction `pgm_error pmg_negative(pgm *neg, const pgm *const orig)`{.C} calculant le négatif de l'image `orig`et la stockant dans `neg` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_negative(pgm *neg, const pgm *const orig)`{.C} calculant le négatif de l'image `orig`et la stockant dans `neg` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. ## Les symétries @@ -153,9 +153,9 @@ Vous pouvez voir un exemple de ces trois symétries aux @fig:mandrill_hor, @fig: Il faut implémenter **au minimum** les fonctions suivantes: -* la fonction `pgm_error pmg_symmetry_hori(pgm *sym, const pgm *const orig)`{.C} calculant la symétrie horizontale de l'image `orig` et la stockant dans `sym` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. -* la fonction `pgm_error pmg_symmetry_vert(pgm *sym, const pgm *const orig)`{.C} calculant la symétrie verticale de l'image `orig` et la stockant dans `sym` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. -* la fonction `pgm_error pmg_symmetry_cent(pgm *sym, const pgm *const orig)`{.C} calculant la symétrie centrale de l'image `orig` et la stockant dans `sym` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_symmetry_hori(pgm *sym, const pgm *const orig)`{.C} calculant la symétrie horizontale de l'image `orig` et la stockant dans `sym` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_symmetry_vert(pgm *sym, const pgm *const orig)`{.C} calculant la symétrie verticale de l'image `orig` et la stockant dans `sym` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_symmetry_cent(pgm *sym, const pgm *const orig)`{.C} calculant la symétrie centrale de l'image `orig` et la stockant dans `sym` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. ## Le photomaton @@ -177,7 +177,7 @@ il faut examiner ce qui se passe sur la première ligne. Il faut implémenter **au minimum** la fonction suivante: -* la fonction `pgm_error pmg_photomaton(pgm *photomaton, const pgm *const orig)`{.C} calculant l'effet photomaton de l'image `orig` et la stockant dans `photomaton` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_photomaton(pgm *photomaton, const pgm *const orig)`{.C} calculant l'effet photomaton de l'image `orig` et la stockant dans `photomaton` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. ## Rogner @@ -190,7 +190,7 @@ des pixels de l'image d'origine. Un exemple peut se trouver sur la @fig:mandrill Il faut implémenter **au minimum** la fonction suivante: -* la fonction `pgm_error pmg_crop(pgm *crop, const pgm *const orig, int32_t x0, int32_t x1, int32_t y0, int32_t y1)`{.C} calculant la sous-image de `orig` aux coordonnées `x0` à `x1` (non-inclu), et `y0` à `y1` (non-inclu). Le résultat est stocké dans `crop` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_crop(pgm *crop, const pgm *const orig, int32_t x0, int32_t x1, int32_t y0, int32_t y1)`{.C} calculant la sous-image de `orig` aux coordonnées `x0` à `x1` (non-inclu), et `y0` à `y1` (non-inclu). Le résultat est stocké dans `crop` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. ## Convolution et filtres [^1] @@ -256,7 +256,7 @@ Si la matrice de convolution est donnée par 1 & 1 & 1 \end{pmatrix}, \end{equation} -on voit que son effet est de moyenner la valeur de chaque pixel avec tous ces voisins +on voit que son effet est de moyenner la valeur de chaque pixel avec tous ses voisins \begin{align} b_{ij}&=\frac{1}{9}(a_{i-1,j-1}+a_{i-1,j}+a_{i-1,j+1}+a_{i,j-1}+a_{i,j}\nonumber\\ &\quad\quad+a_{i,j+1}+a_{i+1,j-1}+a_{i+1,j}+a_{i+1,j+1}). @@ -269,13 +269,13 @@ pour effectuer l'opération de convolution). Il existe différentes solutions po 1. Diminuer la taille de l'image traitée. L'image sera plus petite que l'image de départ de $n$ pixels, où $n\times n$ est la taille de la matrice de convolution. 2. La taille de l'image est étendue en copiant le dernier pixel sur tous les pixels manquants dans une direction donnée. -3. On effectue une réflexion miroir de limage dans toutes les directions. +3. On effectue une réflexion miroir de l'image dans toutes les directions. Dans notre cas, on considérera simplement que les pixels absents valent `0`. ### Remarques -Il se peut que suite é l'application d'un filtre, vous dépassiez la valeur maximale autorisée pour un pixel, ou obteniez +Il se peut que suite à l'application d'un filtre, vous dépassiez la valeur maximale autorisée pour un pixel, ou obteniez une valeur plus petite que zéro. Dans ces cas il faudra ramener les valeurs dans l'intervalle `[0, max]`: 1. Si la valeur du pixel est inférieure à `0`, alors le pixel vaudra `0`. @@ -288,7 +288,7 @@ tronquer le nombre obtenu pour en fait un entier. Il faut implémenter **au minimum** la fonction suivante: -* la fonction `pgm_error pmg_conv(pgm *conv, const pgm *const orig, const matrix *const kernel)`{.C} calculant la convolution entre `orig` et le noyau `kernel`. Le résultat est stocké dans `conv` (qui également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. +* la fonction `pgm_error pmg_conv(pgm *conv, const pgm *const orig, const matrix *const kernel)`{.C} calculant la convolution entre `orig` et le noyau `kernel`. Le résultat est stocké dans `conv` (qui est également allouée dans cette fonction). L'image `orig` n'est pas modifiée. Cette fonction retourne un `pgm_error`. ## Afficher l'image avec la librairie SDL @@ -306,7 +306,7 @@ est `render()`{.C} qui affiche un pixel à la position `x`, `y` à un niveau de # Travail à rendre * Ce travail est à réaliser individuellement. -* Vous devez rendre votre code sur votre répo `git` au plus tard le dimanche 1er décembre 2020 à 23h30 (la version antérieure ou égale à cette date sera récupérée sur votre git). +* Vous devez rendre votre code sur votre répo `git` au plus tard le mardi 1er décembre 2020 à 23h30 (la version antérieure ou égale à cette date sera récupérée sur votre git). * Tout le monde n’ayant pas le même nom de repo git, veuillez écrire l’adresse de votre git, ainsi que votre nom sur le wiki sur `cyberlearn`. N’oubliez pas de laisser votre répo public pour qu'on puisse le cloner. * Suite à ce rendu, vous devrez effectuer une présentation orale de votre travail d’une durée d’au maximum 20 min avec des diapositives. * La présentation orale aura lieu les mercredi 2 et 9 décembre pendant les heures de cours.