TP2 (7105): Synthèse de textures

Par : Bernard Lebel

Le travail de ce projet consistait à répéter les différentes étapes de l'article Image Quilting for Texture Synthesis and Transfer . Quatre techniques sont présentées ci-dessous avec les résultats associés.

Échantillonnage et reconstructionde textures

Pour cette section, les textures d'origines suivantes ont été employées. Les trois premières ont été fournies pour le cours. Les 3 autres ont été tirés de site divers. Les références des 3 images au bas sont en ordre : glitters, pebbles et stones.

In [4]:
y = Image(filename="fig1.png");y
Out[4]:

1. Texture échantillonnée aléatoirement, sans chevauchement (10%)

Dans cette section, il était requis de partir de textures d'origine (voir ci-haut) et de prendre des échantillons aléatoires de cette texture afin d'en composer une nouvelle. Les résultats ont été obtenus à l'aide de taille d'échantillons différents, mais seuls ceux obtenus avec un échantillonnage de 25x25 pixels a été retenus.

In [6]:
x = Image(filename="fig2.png");x
Out[6]:

Les résultats obtenus, à l'exception de celui avec la texture de galets, ne permettent pas d'obtenir une texture uniformément répartie

2. Chevauchement de blocs (25%)

Cette section présente les résultats obtenus lors de l'échantillonnage par chevauchement de blocs. Ce type d'échantillonnage consiste à d'abord placer un bloc aléatoire appartenant à la texture d'origine comme point de départ. Par la suite, le bloc suivant est obtenu en cherchant le bloc dans la texture orignale qui minimise la somme de la différence au carrés des X pixels qui se doivent se chevaucher du bloc précédent et celui rechercher. La valeur de la largeur de la bande de chevauchement est paramétrable. Les résultats obtenus sont présentés ci-dessous.

Chaque échantillon rapporté a été obtenu avec un échantillonnage de 25x25 px, 10 px de chevauchement et une tolérance élevé et faible dans l'ordre d'affichage.

In [8]:
x3 = Image(filename="fig3.png");x3
Out[8]:

Bien que le résultat obtenu soit meilleur que le précdédent, certaines textures comportent des irrégularités que la méthode suivante permet d'atténuer grandement.

3. Recherche de joint (25%)

Cette technique procède dans un premier temps comme la précédente. Toutefois, plutôt que de délimiter arbitrairement la séparation de la région de chevauchement (par exemple, en prenant la moitié de l'image déjà présente et la moitié de l'image ajoutée), cette technique effectue la recherche du chemin de pixel dans la zone de chevauchement qui comporte les pixels dont la valeur est la plus similaire pour les deux images. Ce découpage est utilisé pour coller le nouvel échantillon avec le moins de variations perceptibles dans le motif. Les résultats obtenus sont présentés ci-dessous.

In [10]:
x4 = Image(filename="fig4.png") ; x4
Out[10]:

Les résultats obtenus démontrent bien l'amélioration obtenue lors de l'application de cette technique par rapport à la précédente. Le résultat est effectivement généralement plus homogène. Toutefois, il est intéressant de remarquer que l'application de cette technique sur une texture de texte avec les paramètres utilisés ne semble pas avoir amélioré le résultat.

Transfert de texture

Afin d'obtenir une image "projetée" dans une texture, la technique précédente a été employée pour projeter une texture sur une image afin d'obtenir une reconstruction plus ou moins fidèle de l'image dans une texture toute autre.

Pour ce faire, l'image suivante a été employée à titre d'image de référence. La première illustration correspond à l'image sur laquelle la texture doit être appliquée et la deuxième consiste en la texture à projeter.

In [13]:
x5 = Image(filename="fig5.png") ; x5
Out[13]:

Les résultats obtenus sont présentés ci-dessous. Une basse tolérance (LowTol) signifie que peu d'écart était toléré entre le meilleur échantillon candidat et celui retenu et inversement pour une haute tolérance (HighTol). Une haute importance à l'image cible (HighBg) signifie que plus de poids était accordé à faire correspondre l'échantillon à l'image ciblé plutôt qu'aux échantillons avoisinants et inversement pour une faible importance (LowBg).

In [15]:
x6 = Image(filename="fig6.png") ; x6
Out[15]:

Le même type de travail a été fait sur les images suivantes et les textures correspondantes. Les photos de Blois et du protecteur à cellulaire sont des photos personnels. La photo du chat bougon (grumpy cat) provient d'ici . La tranche de pain provient d'ici. La boule texturée provient d'ici.

In [17]:
x7 = Image(filename="fig7.png") ; x7
Out[17]:

Les meilleurs résultats obtenus sont présentés ci-dessous. Dans certains cas, les résultats présentent des performances assez limitées. Ceci étant dit, bien que de longues heures ont été investies à trouver un problème potentiel dans l'algorithme implémentée, la performance est demeurée inchangée.

In [19]:
x8 = Image(filename="fig8.png") ; x8
Out[19]:

Le même type de traitement a été effectué sur une photo personnelle sur laquelle la texture de croquis a été projetée. Ci-dessous sont présenté l'originale et le meilleur résultat obtenu pour cette photo.

In [21]:
x9 = Image(filename="fig9.png") ; x9
Out[21]: