This is an old revision of the document!
L'objectif de ce TD est d'effectuer le redimensionnement d'une image en appliquant un filtre limitant ainsi les défauts qui peuvent apparaître lorsqu'une image est redimensionnée, notamment les effets d'escalier ou de pixelisation qui peuvent apparaître lors d'un redimensionnement par simple interpolation.
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 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'.
Vous validerez l'installation en exécutant le code de test suivant:
#include "CImg.h" using namespace cimg_library; int main() { CImg<unsigned char> image("lena.jpg"), visu(500,400,1,3,0); const unsigned char red[] = { 255,0,0 }, green[] = { 0,255,0 }, blue[] = { 0,0,255 }; image.blur(2.5); CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile"); while (!main_disp.is_closed() && !draw_disp.is_closed()) { main_disp.wait(); if (main_disp.button() && main_disp.mouse_y()>=0) { const int y = main_disp.mouse_y(); visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.width()-1,y,0,0),red,1,1,0,255,0); visu.draw_graph(image.get_crop(0,y,0,1,image.width()-1,y,0,1),green,1,1,0,255,0); visu.draw_graph(image.get_crop(0,y,0,2,image.width()-1,y,0,2),blue,1,1,0,255,0).display(draw_disp); } } return 0; }
Ce code vous permet de voir comment charger une image de type jpeg, comment afficher une image et comment accéder à un pixel de cette image.
Lors de la soutenance, vous montrerez une exécution de ce code
A partir de la documentation, effectuer rapidement une analyse et une hiérarchie des classes qui sont utiles pour :
Vous effectuerez un schéma récapitulant l'ensemble des ces informations ainsi qu'un ou deux transparents pour les présenter lors de la soutenance.
Nous nous proposons d'agrandir une image par un facteur pouvant aller de x2 à x10. Nous allons étudier dans la suite du sujets plusieurs techniques de sampling permettant de limiter les artéfacts induits par le redimensionnement.
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 :
la couleur du point sera la couleur de son plus proche voisin, soit $(x_i, y_i)$, soit $(x_i, y_i+1)$, soit $(x_i+1, y_i)$, soit $(x_i+1, y_i+1)$.