6. Synthese

6.1. Description

Ce patch permet la création d'une nouvelle image de texture à partir d'un échantillon. Codé d'après un papier de Alexei A. Efros et Willian T. Freeman. Le principe est de prendre des petits rectangles de l'image échantillon et de les 'coller' au mieux pour former l'image finale. On peut ainsi générer des textures de toutes tailles, ainsi que des textures non identiques du fait que le choix des blocs à coller comporte une part de hasard.

6.2. Syntaxe

image_map { synthese taillex,tailley blockx,blocky R1 image_type image_file ... }

taillex et tailley donnent la résolution de l'image à créer. blockx et blocky la taille des rectangles à prendre dans l'échantillon de texture. R1 est un identificateur obtenu à l'aide de seed (#declare R1=seed(1234);), c'est lui qui est utilisé pour la partie aléatoire de l'algorithme. image_type et image_file donnent le fichier image échantillon (exemple: tga "modele.tga". Il faut une image 24 bits). A la suite vous pouvez spécifier les modificateurs habituels d'une image_map (once, map_type etc).

Le temps de synthèse est très dépendant de la taille de l'échantillon, il vaut donc mieux choisir de petites images (moins de 200x200). Le choix de blockx,blocky dépend de l'image modèle, de la taille des structures de la texture.

Note :  Comme le temps de calcul est assez important il vaux mieux générer l'image, la sauver dans un bitmap et puis l'inclure comme une image_map classique ensuite.

6.3. Exemples

Voici les résultats de la synthèse pour quelques textures. Chaque texture échantillon est de taille environ 192x192, et pour chacune d'entre elles deux images de taille 400x400 sont générées : une avec des blocs 40x40 et une avec des blocs 20x20 (La plus réussie est celle présentée).

Pour certains cas où les résultats sont mauvais il doit être possible d'obtenir mieux en choisissant plus subtilement la taille des blocs !

Le script pour générer ces images est le suivant :

#version Unofficial mlpov 0.8;

camera { 
  orthographic
  location <0.5,0.5,-2> right 1*x up 1*y look_at <0.5,0.5,0>
}

#declare R1=seed(1234);

plane { 
  z,0
  pigment {
    image_map { synthese 400,400 20,20 R1 sys "vistex01.bmp" once }
  } 
  finish { ambient 1 }
}

Table 1. Exemples

EnchantillonSynthese

6.4. Program

Look for #ifdef SYNTHESE_PATCH in sources

The patch build a tga image at parsing.

Possible improvements/problems

  • Only works with 24 bits per pixel images (but should not be too difficult to extend)
  • Doesn't really work with large samples
  • Needs better coding, speed optimizations..