This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:cpp [2020/05/25 10:34] bmonsuez |
in204:cpp [2024/07/10 07:26] (current) bmonsuez [Installation d'une bibliothèque] |
||
---|---|---|---|
Line 4: | Line 4: | ||
- | ===== Bibliothèqe de manipulation d'images ===== | + | ===== Bibliothèque de manipulation d'images ===== |
Pour lire et écrire des images, nous vous proposons d'utiliser une bibliothèque pour accéder aux images de types .png et .jpeg. | Pour lire et écrire des images, nous vous proposons d'utiliser une bibliothèque pour accéder aux images de types .png et .jpeg. | ||
- | ==== Installation de la bibliothèque ==== | + | Il est demandé de supporter au moins deux formats d'image. Dans l'absolu, il est souhaitable d'avoir le format .bmp, le format .png ainsi que le format .jpeg. Un plus serait d'avoir le format jpeg 2000. |
- | Pour ce faire, vous allez installer dans un premier temps sur votre environnement la bibliothèque http://www.cimg.eu/ qui vous permettra de lire et d'écrire des fichiers 'image' au format '.jpeg' et '.png'. | + | ==== Installation d'une bibliothèque ==== |
+ | |||
+ | Il vous est proposé d'utiliser la bibliothèque **[[http://cimg.eu|CImg]]**. Cette bibliothèque vous permettra de lire et écrire les fichier ainsi que de manipuler les images. | ||
+ | |||
+ | Vous installerez la bibliothèque dans votre environnement. | ||
==== Validation de l'installation ==== | ==== Validation de l'installation ==== | ||
Line 75: | Line 79: | ||
===== Redimensionnement d'une image par interpolation bilinéaire ===== | ===== Redimensionnement d'une image par interpolation bilinéaire ===== | ||
- | La technique précédent est simple à mettre en oeuvre mais n'est pas très satisfaisante en terme de qualité de rendu, dès que le facteur d'agrandissement est élevé. Nous nous intéressons donc à d'autres techniques permettant de calculer la couleur du point $(x,y)$ qui est introduit lors de la fonction d'agrandissement. Le schéma suivant montre les techniques d'interpolation habituelles selon leur version en une dimension et leur extension à deux dimensions. | + | La technique précédente est simple à mettre en œuvre mais n'est pas très satisfaisante en terme de qualité de rendu, dès que le facteur d'agrandissement est élevé. Nous nous intéressons donc à d'autres techniques permettant de calculer la couleur du point $(x,y)$ qui est introduit lors de la fonction d'agrandissement. Le schéma suivant montre les techniques d'interpolation habituelles selon leur version en une dimension et leur extension à deux dimensions. |
{{:in204:comparison_of_1d_and_2d_interpolation.svg.png?400|}} | {{:in204:comparison_of_1d_and_2d_interpolation.svg.png?400|}} | ||
Line 83: | Line 87: | ||
**Implanter une fonction qui effectue le redimensionnement de l'image en appliquant une interpolation billinéaire. Tester cette fonction sur la même image et pour les mêmes facteurs que pour l'interpolation par plus proche voisin.** | **Implanter une fonction qui effectue le redimensionnement de l'image en appliquant une interpolation billinéaire. Tester cette fonction sur la même image et pour les mêmes facteurs que pour l'interpolation par plus proche voisin.** | ||
- | |||
====== Rendre l'interpolation générique ====== | ====== Rendre l'interpolation générique ====== | ||
+ | |||
+ | ==== Phase 1 ==== | ||
Dans les deux cas précédents, l'interpolation dépend des valeurs des quatres voisins de l'élément $(x^o, y^o)$ que sont les éléments $(x_i, y_j)$, $(x_{i+1}, y_i)$, $(x_i, y_{i, j+1})$, $(x_{i+1}, y_{j+1})$. La seule modification entre la technique d'interpolation des plus proches voisins et l'interpolation biliénaire est la fonction qui calcule la valeur de la couleur de l'élément $(x^o, y^o)$ à partir des éléments $(x_i, y_j)$, $(x_{i+1}, y_i)$, $(x_i, y_{i, j+1})$, $(x_{i+1}, y_{j+1})$. | Dans les deux cas précédents, l'interpolation dépend des valeurs des quatres voisins de l'élément $(x^o, y^o)$ que sont les éléments $(x_i, y_j)$, $(x_{i+1}, y_i)$, $(x_i, y_{i, j+1})$, $(x_{i+1}, y_{j+1})$. La seule modification entre la technique d'interpolation des plus proches voisins et l'interpolation biliénaire est la fonction qui calcule la valeur de la couleur de l'élément $(x^o, y^o)$ à partir des éléments $(x_i, y_j)$, $(x_{i+1}, y_i)$, $(x_i, y_{i, j+1})$, $(x_{i+1}, y_{j+1})$. | ||
Line 92: | Line 97: | ||
<code cpp> | <code cpp> | ||
- | class resize_image | + | |
+ | class resize_image_base | ||
{ | { | ||
public: | public: | ||
void resize(const CImg<unsigned char>& source, CImg<unsigned char>& destination); | void resize(const CImg<unsigned char>& source, CImg<unsigned char>& destination); | ||
- | virtual estimate_color(const CImg<unsigned char>& source, float x_o, float y_o) = 0; | + | Color estimate_color(const CImg<unsigned char>& source, float x_o, float y_o) = 0; |
} | } | ||
+ | |||
+ | class resize_nearest_neighbour: resize_image_base | ||
+ | { | ||
+ | public: | ||
+ | Color estimate_color(const CImg<unsigned char>& source, float x_o, float y_o); | ||
+ | } | ||
+ | |||
+ | class resize_bilinear_interpolation: resize_image_base | ||
+ | { | ||
+ | public: | ||
+ | Color estimate_color(const CImg<unsigned char>& source, float x_o, float y_o); | ||
+ | } | ||
+ | |||
+ | void resize_image_base::resize(const CImg<unsigned char>& source, CImg<unsigned char>& destination) | ||
+ | { | ||
+ | // L'image destination est l'image qui contiendra les pixels de l'image source après redimensionnement. | ||
+ | // La taille de l'image destination permet de calculer le facteur de redimensionnement nécessaire. | ||
+ | // Cet algorithme appelle pour chaque point (x^d, y^d) dans "destination", la fonction "estimate_color". | ||
+ | } | ||
+ | |||
+ | color resize_nearest_neighbour::estimate_color(const CImg<unsigned char>& source, float x_o, float y_o) | ||
+ | { | ||
+ | // Implantation du code calculant la couleur associée au point (x^o, y^o) pour l'implantation par | ||
+ | // plus proche voisin. | ||
+ | } | ||
+ | |||
+ | color resize_bilinear_interpolation::estimate_color(const CImg<unsigned char>& source, float x_o, float y_o) | ||
+ | { | ||
+ | // Implantation du code calculant la couleur associée au point (x^o, y^o) pour l'implantation par | ||
+ | // plus proche voisin. | ||
+ | } | ||
+ | |||
</code> | </code> | ||
+ | ** Effectuer la transformation de votre code pour le mettre sous la forme d'une telle classe. ** | ||
+ | |||
+ | ==== Phase 2 ==== | ||
+ | Comment généraliser cette approche à des fonctions plus complexes nécessitant non pas les quatres plus proches voisins mais par exemple une matrice 4x4 définis par $(x_{i-1}\ldots x_{i+2}, y_{i-1},\ldots y_{i+2})$ pour notamment l'interpolation cubique, sachant que $x_i, y_i$ est égal à $(\lfloor(x^o), \lfloor(y^o))$. | ||