Outils pour utilisateurs

Outils du site


wiki:tutoriels:processing:entrelacer-deux-images-processing

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
wiki:tutoriels:processing:entrelacer-deux-images-processing [2021/06/24 09:09]
damien.muti créée
wiki:tutoriels:processing:entrelacer-deux-images-processing [2021/06/24 09:32]
damien.muti [Algorithme]
Ligne 7: Ligne 7:
   * **Fichiers** :    * **Fichiers** : 
   * **Liens** :   * **Liens** :
 +
 +
 +===== Algorithme =====
 +
 +Considérons deux images I1 et I2, de même taille:
 +
 +I1 : {{ :wiki:tutoriels:processing:im1.png?400 |I1}}
 +
 +I2: {{ :wiki:tutoriels:processing:im2.png?400 |I2}}
 +
 +L'algorithme consiste dans un premier temps à découper chaque image en "nbEntrelacement""bandes" élémentaires. 
 +
 +Ensuite, chaque bande élémentaire est affichée alternativement, dans leur ordre de découpage, dans une troisième image créée à cet effet :
 +
 +{{ :wiki:tutoriels:processing:image_entrelacee.jpg?800 |}}
 +
 +
 +===== Programme =====
 +Le code Processing est le suivant : {{ :wiki:tutoriels:processing:doubleimagefin.zip |}}
 +
 +<code>
 +PImage I1, I2, I3;
 +int W, H;
 +int nbEntrelacement = 10; // nombre de "bande" d'images entrelacées
 +
 +
 +void setup() {
 +  size(1200, 1800);
 +  I1=loadImage("im1.png");
 +  I2=loadImage("im2.png");
 +  W=I1.width;
 +  H=I1.height;
 +  // entrelacement images
 +  I3=entrelacer(I1, I2, nbEntrelacement);
 +}
 +
 +void draw() {
 +  //image(I1, 0, 0, W/2, H/2);
 +  //image(I2, 0, I1.height/2, W/2, H/2);
 +  image(I3, 0, 0, W, H/2);
 +}
 +
 +PImage entrelacer(PImage I1, PImage I2, int N) {// I1 et I2, les deux images; N : nombre de bandes d'entrelacement
 +  // largeur et hauteur de l'image créée
 +  int W = min(I1.width, I2.width);
 +  int H = min(I1.height, I2.height);
 +  // création de l'image finale
 +  PImage I3 = createImage(2*W, H, RGB);
 +  // chargement des tableaux de pixels
 +  I1.loadPixels();
 +  I2.loadPixels();
 +  I3.loadPixels();
 +
 +  // taille des bandes
 +  int L = floor(W/N);
 +  // processus d'entremacement
 +  /* n : indice de la bande et L largeur de la bande
 +   pour n=3, indices de I3 pour la bande issue de I1 : de 6*L à 7*L-1, Idem pour I2 : de 7*L à 8*L-1
 +   pour n=4, indices de I3 pour la bande issue de I1 : de 8*L à 9*L-1, Idem pour I2 : de 9*L à 10*L-1
 +   ...
 +   pour n=k, indices de I3 pour la bande issue de I1 : de (2*k)*L à (2*k+1)*L-1, Idem pour I2 : de (2*k+1)*L à 2*(k+1)*L-1
 +   */
 +  for (int i=0; i<W; i++) { // indice de la ligne dans I1 et I2
 +    for (int j=0; j<H; j++) {// indice de la colonne dans I1, I2, et I3
 +      // indice de la colonne atteinte par l'indice i 
 +      int n=floor(i/L); // partie entière de i/L
 +      // indice du pixel dans la nième colonne
 +      int k=i%L; // reste de la division euclidienne de i par L
 +
 +      I3.pixels[j*I3.width+((2*n*L)+k)]=I1.pixels[j*W+i]; // première bande issue de I1
 +      I3.pixels[j*I3.width+((2*n+1)*L+k)]=I2.pixels[j*W+i]; // deuxième bande issue de I2
 +    }
 +  }
 +
 +  // mise à jour des pixels dans l'image finale
 +  I3.updatePixels();
 +
 +  return I3;
 +}
 +
 +/// méthode transformant l'image comme vecteur unidimentionnel (une ligne), en matrice
 +color[][] imageVector2Matrix(PImage I) {
 +  // création d'une matrice ayant la taille de l'image I
 +  int W=I.width;
 +  int H =I.height;
 +  color[][] Iprim = new color[W][H];
 +  for (int i=0; i<W; i++) {
 +    for (int j=0; i<H; i++) {
 +      Iprim[i][j]=I.pixels[j*W+i];
 +    }
 +  }
 +  return Iprim;
 +}
 +
 +/// méthode transformant l'image comme vecteur unidimentionnel (une ligne), en matrice
 +PImage  imageMatrix2Vector(color[][] Iprim) {
 +  // création d'une matrice ayant la taille de l'image I
 +  int W = Iprim.length;
 +  int H = Iprim[0].length;
 +  PImage I = createImage(W, H, RGB);
 +  for (int i=0; i<W; i++) {
 +    for (int j=0; i<H; i++) {
 +      I.pixels[j*W+i]=Iprim[i][j];
 +    }
 +  }
 +  return I;
 +}
 +</code>
wiki/tutoriels/processing/entrelacer-deux-images-processing.txt · Dernière modification: 2021/06/24 09:35 de damien.muti