La première approche consiste simplement à prendre des sections aléatoires de l'échantillon de texture et de les concaténer. Cette approche n'est pas très bonne puisque qu'elle creer des jonctions visibles.
resultas avec la méthode 1. Les textures utilisée puis les images générées. On remarque que les jonctions sont visibles.
La seconde méthode est un peu meilleure. On choisit d'abord un bloc aléatoire pour la section supérieure gauche. Puis, on fait une SDC (on aurait pu faire une convolution pour de meilleures performances) sur toutes les possibilités dans l'échantillon afin de générer une carte de scores. Parmis les meilleurs blocs, on en choisit un aléatoirement. L'algorithme requiert donc 3 paramètres: la grosseur des blocs, la grosseur de la zone de cheminement ainsi que le seuil de tolérence pour le choix des blocs. En fesant varier ces paramètres, on obtiens différents résultats dépendemment de la texture utilisée. Par exemple, la brique fonctionne mieux avec les gros blocs tandis que la mousse et les macaronis fonctionnent mieux avec les petits blocs. Dans l'article, ils proposent d'utiliser un chevauchement d'environ 1/6 du bloc.
resultas avec la méthode 2, avec de petits blocs.
resultas avec la méthode 2, avec de gros blocs.
Las troisième méthode ressemble beaucoup à la seconde. Par contre, en plus du chevauchement, on découpe le bloc avec une coupure qui minimise l'erreur. Pour ce faire, on génère une carte de coûts en soustrayant les images dans la zone de chevauchement. Puis, par programation dynamique, je trouve le chemin ayant le moindre cout et j'en génère un masque servant à découper le bloc. On a alors une coupure qui ne se voit presque pas.
Génération de la carte de coûts
Masque a partir du chemin le plus court
La plupart des résultats sont très convaincants. Pour chaque cas, j'ai fait plusieurs essais avec différents paramètres pour générer la meilleure synthèse possible. Par contre, certains résultats comme les tuiles en diagonales sont très difficiles à synthétiser. En effet, l'algorithme utilise des splines verticales et horizontales, mais a de la misère à effectuer des jonctions diagonales. Les nouilles aussi semble difficiles à synth.tiser, puisqu'un humain s'attends à voir des nouilles alors que l'algorithme cherche simplement à minimiser les erreurs de jonctions.
Le transfert de textures est basé sur la méthode 3 de la synthèse de textures, recherche de joints. En fait, la seule différence réside dans le calcul de la carte d'erreurs lorsqu'on fait la SDC (ou la convolution). En effet, pour chaque bloc, à la place de calculer l'erreur de la façon suivante:
On la calcule de cette manière:
On ajoute donc un terme associé à la ressemblance avec l'image cible. Le terme Alpha permet de choisir le compromis entre la continuité des textures et la ressemblance à l'image cible.
Par contre, lorsqu'on calcule la ressemblance entre la texture et l'image cible, on applique d'abord un flou sur toutes les deux images puisque ce sont les basses fréquences que l'on veut reproduire.