TP2: Synthèse de textures

Mise en situation et méthodologie

L'objectif de ce deuxième travail pratique est de se familiariser avec une approche d'étalement de texture. Plus précisément, on cherche à obtenir une texture d'une dimension M à partir d'une texture à dimension NM > N. Trois approches différentes seront faites et comparées dans ce rapport. Les trois approches impliquent l'extrusion de petits blocs de texture échantillonnés dans une petite image de texture puis recollés dans une image de dimension supérieure. Cette extension des textures pourraient être utile lorsque l'on souhaite remplir un trou dans une image texturée assez uniformément.

Figure tirée de [Efros et Freeman 2001]


La première approche est une approche aléatoire. Celle-ci est la plus simple méthode mais donnant des résultats loin d'être concluant. La deuxième méthode implique un chevauchement entre les blocs de dimension défini par l'utilisateur. Les blocs sont choisis de manière à réduire l'erreur quadratique dans la zone en recouvrement. Les pixels en recouvrement sont moyennés afin de réduire l'importance des effets de bord. La troisème méthode et celle qui sera le plus développé dans le cadre de ce travail pratique. La méthodologie initiale est la même que celle employé dans la deuxième méthode. Toutefois, le traitement de la zone en recouvrement est différente. Cette fois, au lieu de faire la moyenne sur les pixels en recouvrement, on va définir un masque binaire spécifiant quelle région du nouveau bloc écrasera la section déja présente dans l'image. Des détails supplémentaires seront ajoutés à la section Méthode 3: Coupure aux frontières avec une erreur minimale.



Méthode 1: Approche avec blocs sélectionnés aléatoirement

Cette méthode, comme il a été mentionné, est la technique la plus simple mais la moins satisfaisante. Il s'agit d'aller échantillonner des blocs aléatoirement dans la texture de base et de les placer consécutivement dans l'image finale. Cette technique résulte en une image avec aucune relation entre deux blocs suivant entrainant une démarcation prononcée entre deux blocs voisins.

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Source texture

Texture finale

Texture d'origine

Source texture

Texture finale

Texture d'origine

Source texture

Texture finale


Méthode 2: Approche avec blocs sélectionnés avec une contrainte de chevauchement

Dans cette partie, on ajuste la position des blocs de manière à avoir un chevauchement entre les blocs voisins. Le nouveau bloc doit par contre minimiser l'erreur quadratique dans la région en chevauchement. Un bloc est choisi aléatoirement entre les blocs ayant la plus faible erreur. De plus, dans la région en chevauchement, on applique une moyenne ce qui va rendre les zones en recouvrement floues. La méthode n'est toujours pas optimale, mais reste elle reste meilleure que la première approche.

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale


Méthode 3: Approche avec coupure aux frontières avec une erreur minimale

Cette méthode reprend les premières étapes de la méthode 2. Cependant, au lieu d'appliquer une moyenne sur la région en chevauchement, on va générer un masque binaire qui va spécifier quels pixels de la région en chevauchement sera les pixels du premier bloc et quels pixels sera les pixels du deuxième bloc. Pour construire ce masque, on construit une bande ayant comme élément la somme des différences au carré entre les pixels du premier bloc et du second. On passe ensuite un chemin où l'erreur est minimale dans la zone en chevauchement. Pour les blocs ayant un recouvrement en «L inversé» (une bande verticale et un bande horizontale), on applique d'abord l'algorithme sur la bande horizontale pui sur la bande verticale. Pour définir le masque binaire où les deux masques se rejoignent, on utilise l'opérateur OU entre les deux masques (masque1 | masque2).

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale

Texture d'origine

Texture finale


Comparaison entre les trois méthodes à tolérance égale

Texture d'origine

Texture après la méthode 1

Texture après la méthode 2

Texture après la méthode 3

Texture d'origine

Texture après la méthode 1

Texture après la méthode 2

Texture après la méthode 3

Texture d'origine

Texture après la méthode 1

Texture après la méthode 2

Texture après la méthode 3

Texture d'origine

Texture après la méthode 1

Texture après la méthode 2

Texture après la méthode 3

Texture d'origine

Texture après la méthode 1

Texture après la méthode 2

Texture après la méthode 3


Résultats lorsque la tolérance est modifiée

La tolérance est un paramètre entrée par l'utilisateur. Ce facteur permet d'avoir de la variation dans la texture pour ne pas qu'elle répète les mêmes motifs périodiquement. Lorsque l'on l'augmente, on permet à l'algorithme de ne pas uniquement prendre le bloc qui minimise l'erreur quadratique mais on lui fournit une liste de bloc qui respecte un seuil d'erreur maximal. Les résultats sont présentés dans le tableau suivant.

Tolérance: 0.001

Tolérance: 0.05

Tolérance: 0.1

Tolérance: 0.2

Tolérance: 0.001

Tolérance: 0.05

Tolérance: 0.1

Tolérance: 0.2


Résultats lorsque la zone de chevauchement est modifiée

Lorsque l'on augmente la zone de chevauchement, on considère plus de pixels pour choisir le bloc voisin. Si la zone de chevauchement est plus faible, il risque d'avoir une démarquation prononcée entre deux blocs voisins. L'effet est plus visible lorsque la texture est moins stocastique comme dans le cas de la première ligne du tableau suivant.

Chevauchement: 10%

Chevauchement: 20%

Chevauchement: 40%

Chevauchement: 10%

Chevauchement: 20%

Chevauchement: 40%

Transfert de texture

Cette deuxième section du travail requiert d'appliquer une texture sur une image quelconque. Pour ce faire, on va réutiliser l'algorithme présenté à la méthode 3. Cependant, lorsque l'on va venir choisir le bloc à placer dans l'image, on va devoir considérer un facteur supplémentaire. En effet, le bloc doit considérer la luminance sur la photo cible (e.g. le visage d'une personne) à la position où doit se placer le bloc. L'image cible doit donc être travaillé sur le troisième canal lorsqu'il est convertit de RGB à HSV. Les images cibles et de textures seront redimensionnées généralement de moitié. On diminue alors considérablement le temps de calcul. La dernière ligne et la dernière colonne de bloc n'ont pas été évaluées car ces blocs n'entraient pas dans l'espace restant. Pour s'assurer d'avoir une bonne variation entre les différents niveaux d'intensité, le calcul de l'erreur entre un bloc échantillonné dans le visage. Il est à noter que la valeur de tolérance était trop faible pour le transfer de texture sur le requin. Il en résulte qu'un bloc se répète trop souvent dans les zones homogènes.

Transfert de texture sur des modelèles trouvés sur le net

Visage d'origine et texture d'origine

Source visage

Texture finale

Visage d'origine et texture d'origine

Source visage



Texture finale

Visage d'origine et texture d'origine


Texture finale

Visage d'origine et texture d'origine

Source visage

Texture finale


Transfert de texture sur mon visage

Visage d'origine et texture d'origine



Texture finale



Simon Fréchet
Université Laval, 2015