User Tools

Site Tools


in204:cpp

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
in204:cpp [2020/05/25 10:11]
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 59: Line 63:
  
 Nous nous proposons d'​agrandir une image par un facteur défini par un nombre à virgule flottante ($> 1.0$). Nous allons étudier dans la suite du sujets plusieurs techniques de sampling permettant de limiter les artéfacts induits par le redimensionnement. Nous nous proposons d'​agrandir une image par un facteur défini par un nombre à virgule flottante ($> 1.0$). Nous allons étudier dans la suite du sujets plusieurs techniques de sampling permettant de limiter les artéfacts induits par le redimensionnement.
 +
 +Agrandir l'​image correspond à ajouter des lignes et des colonnes à la matrice représentant l'​image actuelle. Supposons que nous ayons une matrice de 4x4, c'​est-à-dire 4 lignes de 4 colonnes, que nous appliquons un coefficient de $f=2.75$, nous obtiendrons donc une matrice de 11 lignes et 11 colonnes. Nous allons donc avoir $x^d$ (resp. $y^d$) qui va varier entre 0 et 10. Quand nous calculons la valeur de $x^d$ (resp. $y^d$), nous devons calculer cette position dans le référentiel initial $x^o$ qui sera égal à $\frac{x^d}{f}$. Si nous considérons que $x^o = 6$, $y^o = 3$, les $(x^d, y^d)$ associés auront les valeurs : $2.18$ et $1.09$. Ce point sera donc compris entre les points $(2,1)$, $(2,2)$, $(3,1)$ et $(3,2)$ dans le référentiel de la matrice initial. Il faut donc estimer la couleur du point $(x_d, y_d)$ à partir des couleurs des points $(2,1)$, $(2,2)$, $(3,1)$ et $(3,2)$
  
 ==== Redimensionnement d'une image par la technique des plus proches voisins === ==== Redimensionnement d'une image par la technique des plus proches voisins ===
  
-L'​idée ​dans l'​algorithme ​est lorsqu'​un pixel est introduit, ​de considérer que ce pixel possède la couleur de son plus proche voisin. Dans ce cas, si nous introduisons un nouveau pixel $(x,y)$ situé entre $(x_i,y_i)$ et $(x_{i+1}, y_{i+1})$, tel que défini dans le schéma suivant :+L'​idée ​la plus simple ​est de considérer que ce pixel possède la couleur de son plus proche voisin. Dans ce cas, si nous introduisons un nouveau pixel $(x,y)$ situé entre $(x_i,y_i)$ et $(x_{i+1}, y_{i+1})$, tel que défini dans le schéma suivant :
  
 {{:​in204:​interpolation_visualisation.png?​600|}} {{:​in204:​interpolation_visualisation.png?​600|}}
Line 73: 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|}}
 +
 L'​algorithme précédent correspond au 2D-nearest-neighbour. Nous souhaitons désormais fait une interpolation bilinéaire,​ il s'agit de faire d'​abord une interpolation linéaire sur l'axe des $x$ puis une interpolation sur l'ax L'​algorithme précédent correspond au 2D-nearest-neighbour. Nous souhaitons désormais fait une interpolation bilinéaire,​ il s'agit de faire d'​abord une interpolation linéaire sur l'axe des $x$ puis une interpolation sur l'ax
 e des $y$. e des $y$.
  
 **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 ======
 +
 +==== 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})$.
 +
 +Nous pouvons imaginer dans ce cas de définir une classe qui implante un algorithme générique qui appel à une fonction virtuelle et deux classes héritant de cette classe générique qui définit la fonction générique virtuelle d'​interpolation.
 +
 +<code cpp>
 +
 +class resize_image_base
 +{
 +public: ​
 +    void resize(const CImg<​unsigned char>&​ source, CImg<​unsigned char>&​ destination);​
 +    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>​
 +
 +** 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))$.
  
  
in204/cpp.1590401483.txt.gz · Last modified: 2020/05/25 10:11 by bmonsuez