Exemple 3 :

Affichage d'une image en niveaux de gris ou en fausses souleurs


Principe

       Une fonction bidimensionnelle f(x,y) peut se représenter comme une image. On discrétise les valeurs de la fonction dans un tableau bidimensionnel z[i][j] sous forme d'une grille de pixels repérés par leur ligne i et leur colonne j. Le principe de la discrétisation est illustré par la figure ci-dessous.


 
 

Correspondances entre pixels (i,j) et coordonnées (x,y) :

Dans le langage PgPlot, les valeurs (x,y) sont appelées "coordonnées utilisateur". Soient idim et jdim le nombre de lignes et de colonnes du tableau z[][]

    La représentation du tableau z[][] se fait en attribuant un niveau de gris à chaque point [i,j]. La valeur maximale de z prend la couleur blanche, la valeur minimale est en noir et les valeurs intermédiaires en gris plus ou moins foncé. Le tracé lui-même est effectué par la fonction cpgimag Voir l'exemple du tracé de la fonction de Bessel ci-dessous (programme 1).


Palettes de couleur (Look Up Table ou LUT)

    On peut aussi attribuer une couleur à chaque point [i,j] en fonction de la valeur de z[i][j]. On a alors besoin d'une correspondance entre valeurs de z et couleur. Cette correspondance est faite au moyen d'une palette de couleurs.

    Le principe est le suivant. Soient zmin et zmax sont les valeurs minimum et maximum du tableau z[][]. On découpe l'intervalle [zmin,zmax] en 256 intervalles. Pour chaque intervalle, on attribue un niveau de rouge R (entre 0 et 1), un niveau de vert V et un niveau de bleu B. Une palette de couleurs est donc un ensemble de trois R[256], V[256] et B[256]. La couleur blanche correspond à R=V=B=1.

    Des palettes prédéfinies existent dans le répertoire /users/licence/examples/Graphique/lut/ . On peut les lire et les installer à l'aide de la fonction cpgslut. L'exemple du programme 2 montre l'utilisation d'une palette de couleurs.


Programme 1 : affichage en niveaux de gris de la fonction de Bessel J0(r)


**************************************************************
 image.c
 Representation de fonctions z=f(x,y)
 sous forme d'image en couleurs ou en niveaux de gris
 exemple de la fonction : j0(r) avec r=sqrt(x^2+y^2)
 **************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "/usr/include/cpgplot.h"
 

main()
 

{
  int i,j;                     /* indices de boucle */
  int dimx=256,dimy=256;       /* nb de points en x et en y */
  float tab[dimx*dimy];                  /* tableau des valeurs de la fonction */
  double r,z;                  /* variables intermediaires pour le calcul */
  float xmin,xmax;            /* intervalle. en x */
  float ymin,ymax;            /* intervalle. en y */
  float zmin,zmax;            /* min et max des valeurs de la fonction */
  float tr[6];                /* matrice utilisee par pgimag */
 
 

  /* Remplissage du tableau de valeurs
     ---------------------------------  */
  for (i=0; i<dimy; i++)
  for (j=0; j<dimx; j++)
    {
      r=hypot((double)i-dimy/2,(double)j-dimx/2)/10.;  /* distance/10  pt courant-centre */
      z=j0(r);
      tab[i*dimx+j]=(float)z;
    }

  /* Bornes
     ------ */
  xmin=-dimx/20; xmax=dimx/20;
  ymin=-dimy/20; ymax=dimy/20;
  zmin=0; zmax=1;

  /* Matrice de passage pixels -> coordonnees user
     --------------------------------------------- */
  tr[0]=xmin;
  tr[1]=(xmax-xmin)/dimx;
  tr[2]=0;
  tr[3]=ymin;
  tr[4]=0;
  tr[5]=(ymax-ymin)/dimy;
 

  /* Affichage image 2d
     ------------------ */

  cpgopen("/xw");
  cpgenv(xmin,xmax,ymin,ymax,1,0);
  cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
  cpglab("X","Y","Fonction de bessel j0(r)");
 

  cpgask(1);
  cpgend();
}
 
 
 

Résultat :

 

 
 
 
 
 


 


Programme 2 : affichage en niveaux de gris et en couleurs


/**************************************************************
 imcolor.c
 Representation de fonctions z=f(x,y)
 sous forme d'image en couleurs
 exemple de la fonction : j0(r) avec r=sqrt(x^2+y^2)
 **************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "/usr/include/cpgplot.h"
#include "cpgslut.c"                  /* fonction table de couleurs */

main()
 

{
  int i,j;                     /* indices de boucle */
  int dimx=256,dimy=256;       /* nb de points en x et en y */
  float *tab;                  /* tableau des valeurs de la fonction */
  double r,z;                  /* variables intermediaires pour le calcul */
  float xmin,xmax;            /* intervalle. en x */
  float ymin,ymax;            /* intervalle. en y */
  float zmin,zmax;            /* min et max des valeurs de la fonction */
  float tr[6];                /* matrice utilisee par pgimag */
 
 

  tab=(float *)malloc(sizeof(float)*dimx*dimy); /* alloc memoire */

  /* Remplissage du tableau de valeurs
     ---------------------------------  */
  for (i=0; i<dimy; i++)
  for (j=0; j<dimx; j++)
    {
      r=hypot((double)i-dimy/2,(double)j-dimx/2)/10.;  /* distance/10  pt courant-centre */
      z=j0(r);
      tab[i*dimx+j]=(float)z;
    }

  /* Bornes
     ------ */
  xmin=-dimx/20; xmax=dimx/20;
  ymin=-dimy/20; ymax=dimy/20;
  zmin=0; zmax=1;

  /* Matrice de passage pixels -> coordonnees user
     --------------------------------------------- */
  tr[0]=xmin;
  tr[1]=(xmax-xmin)/dimx;
  tr[2]=0;
  tr[3]=ymin;
  tr[4]=0;
  tr[5]=(ymax-ymin)/dimy;
 

  /* Affichage image 2d
     ------------------ */
  cpgbeg(0,"?",2,1);
 

  /* Graphe dans la 1ere fenetre en gris
 ----------------------------------- */
  cpgenv(xmin,xmax,ymin,ymax,1,0);
  cpglab("x","y","Fonction de bessel j0(r)");
  cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);
 

  /* Graphe dans la 2e fenetre en couleur
 ---------------------------------------- */
  cpgenv(xmin,xmax,ymin,ymax,1,0);
  cpgsch(2);                              /* taille caracteres de la legende */
  cpglab("x","y","La meme en couleur");
  cpgslut("lut/idl11.lutasc");
  cpgimag(tab,dimx,dimy,1,dimx,1,dimy,zmin,zmax,tr);

  cpgend();
}
 

Résultat :