Synthèse de textures

Comment la science peut changer l'apophénie en conspiration.

Les textures

Une texture représente toute surface d'un objet dans le domaine tridimensionnel. Dans le cas de la photographie, une texture a une définition un peu plus floue, puisqu'elle dépend de son contexte. Par exemple, un soulier n'est pas une texture lorsque pris en gros plan, mais un étalage de souliers peut être considéré comme une texture. Interpréter un segment d'image comme une texture permet de générer de nouveaux segments lui étant apparentés, tout en étant différents.

La synthèse de texture

Le but du présent travail est de générer des textures à l'aide d'exemples à plus petite échelle. Les approches basées sur les données employées sont tirées de :
Efros, Alexei A., and William T. Freeman. "Image quilting for texture synthesis and transfer." Proceedings of the 28th annual conference on Computer graphics and interactive techniques. ACM, 2001.


Briques

Nuages (Source)

Terre (Source)

Métal rouillé (Source)

Texte

Neige
Figure 1. Textures utilisées pour l'exécution des différents algorithmes.

Texture échantillonnée aléatoirement, sans chevauchement

Technique

Des zones aléatoires d'une taille patchsize sont sélectionnées au sein de l'image source et placées une après l'autre dans la texture de sortie. Cette technique est très simple, mais donne des résultats peu convaincants lors que la texture n'est pas stochastique ou quasi-stochastique.

Résultats

Chevauchement de blocs

Technique

La deuxième technique de synthèse de texture présentée débute par le choix d'un bloc aléatoire dans la texture source de taille patchsize. Ensuite, tous les blocs subséquents sont choisis en déterminant une zone de chevauchement avec la texture cible générée jusqu'à présent de taille overlap et en sélectionnant un bloc dans la texture source parmis les zones les plus ressemblantes à cette zone de chevauchement. Pour se faire, une corrélation croisée est employée et retourne la carte de ressemblance de la zone de chevauchement avec la texture source. Pour une zone de chevauchement $f$ sur une texture source $g$, la corrélation s'exprime $h = f \star g$. Des regroupements de pixels sont trouvés aux zones potentiellement intéressantes en effectuant $ h > \max{(h)} \cdot (1-\mathrm{tol}) $, où $ \mathrm{tol} $ est la tolérance, un paramètre d'entrée de l'algorithme. Ensuite, le maximum de chacun de ces regroupements de pixels est trouvé. Ces maximums constituent les choix de zones potentielles dans la texture source. La zone choisie est déterminée aléatoirement parmis ces zones potentielles.

Figure 2. Haut gauche : résultat de la corrélation pour un bloc en particulier. Les endroits considérés (au-delà du seuil de tolérance) sont les points bleus. Bas gauche : bloc correlée avec la texture source. Haut droit : bloc choisi aléatoirement parmis les points bleus. Bas droite : Résultat de la synthèse jusqu'à présent.

Résultats

On remarque que les images générées sont déjà un peu mieux que celles de la technique précédente. Une chose est cependant importante: la corrélation est effectuée sur les images une fois converties en tons de gris. Ceci signifie que les couleurs ne sont pas tenues en compte lors de l'analyse de la similarité. Le texte est particulièrement plus intéressant et le sable est presque sans coupure. Le reste semble toujours découpé, cependant.

Recherche de joint

Technique

La recherche de joint reprend les idées de la technique précédente, soit l'emploi de zones de chevauchement. Cependant, au lieu de remplacer le bloc, elle consiste à trouver le chemin de coupure optimal dans cette zone de chevauchement. La recherche de joint a donc pour but de trouver la séquence de pixels dans la zone de chevauchement qui contient le moins d'informations, soit le moins d'énergie visuelle. Pour se faire, on convertit la zone de chevauchement en carte d'énergie en y trouvant son gradient. Une fois effectué, on peut trouver le chemin minimum en appliquant une filtre non-linéaire trouvant le minimum de chaque colonne de l'image dans un rayon de 1 pixel (donnant un noyau effectif de longueur 3). Il est alors possible d'additionner le résultat de chacune des colonnes aux valeurs de la colonne suivante, produisant une somme cummulative des minimums des trois pixels connexes de la colonne précédente. Pour trouver le joint (chemin de coupure), il suffit alors de trouver la valeur minimale de la dernière colonne et de remonter les colonnes en cherchant les valeurs minimales connexes.

Figure 3. Haut gauche : Joint (chemin de coupure) trouvé. Bas gauche : Masque à appliquer sur les deux images. Haut droit : zone de chevauchement déjà présente dans la texture cible. Bas droite : Résultat de la jointure entre la zone de chevauchement (haut droit) et un bloc choisi avec l'algorithme de la question précédente.

Résultats

Les images générées sont plus fluides. On le remarque surtout sur la texture de ciel et de neige. Tout comme la technique précédente, les alignement furent réalisés sur des tons de gris, tout comme le calcul de l'énergie pour le découpage. On remarque ainsi que l'algorithme n'a aucun problème à joindre le centre d'un nuage (sans hautes fréquences) avec un bleu d'atmosphère (sans hautes fréquences également), car pour lui, il n'y a pas d'énergie dans ces zones.

Transfert de texture

Technique

Le transfert de texture est réalisé en effectuant les mêmes étapes que la technique précédente mais en ajoutant un paramètre alpha. Ce dernier permet de choisir entre la corrélation de la surface source et une texture de référence, avec l'équation suivante: $ h = \alpha \cdot h_s + \left( 1 - \alpha \right) \cdot h_r $ où $h_s$ est la corrélation avec la texture source et $h_r$ avec la texture de référence. Le reste de l'algorithme de la technique précédente est appliqué au résultat $h$ de cette opération.

Résultats

Des petits blocs ont été employés pour donner ces résultats, afin de pouvoir bien reconnaitre la texture de référence. On remarque que le texte donne un résultat intéressant et le sable également, donnant un effet de profondeur. On remarque que le manque de données dans la texture de référence se traduit en multiple blocs identiques.

Figure 4. Image de Feymann employée pour le transfert de texture.

Figure 5. Esquisse employée pour le transfert de texture.

Figure 6. Image de l'auteur de l'article employée pour le transfert de texture. Image prise du site web personnel de l'auteur (http://www.eecs.berkeley.edu/~efros/).

Figure 7. Carte du monde employée pour le transfert de texture. Source: Wikipédia.