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 N où M > 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]
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 | Texture finale | Texture d'origine | Texture finale | Texture d'origine | Texture finale |
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 |
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 |
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 |
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% |
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.
Visage d'origine et texture d'origine | Texture finale | Visage d'origine et texture d'origine | Texture finale |
Visage d'origine et texture d'origine | Texture finale | Visage d'origine et texture d'origine | Texture finale |
Visage d'origine et texture d'origine | Texture finale |
Simon Fréchet
Université Laval, 2015