User Tools

Site Tools


in204:cpp

This is an old revision of the document!


Redimensionnement d'une image par filtrage

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.

Bibliothèqe 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.

Installation de la bibliothèque

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'.

Validation de l'installation

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

Analyse et structure de la bibliothèque

A partir de la documentation, effectuer rapidement une analyse et une hiérarchie des classes qui sont utiles pour :

  1. la représentation des images,
  2. la représentation des pixels dans les images (puisque nous allons manipuler directement ces pixels dans la seconde partie de cet exercice)
  3. la visualisation des images.

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.

Redimensionnement d'une image

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.

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 :

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})$.

in204/cpp.1590399647.txt.gz · Last modified: 2020/05/25 09:40 by bmonsuez