Travail présenté à M. Jean-François Lalonde
Remis le 3 mai 2018
Suivant les instructions de la publication de SIGGRAPH 2016 Band-Sifting Decomposition for Image Based Material Editing, les résultats ont été reproduit dans matlab. Le travail est assé simple et c'est un peu l'objectif. L'objectif est surtout de faire des retouches d'images sur de la vidéo en direct. Alors, les gros traitement lourds ne sont pas une bonne idée pour avoir un nombre d'images par secondes intéressant. Pour y arriver, la publication suggère de prendre une image en cie*LAB de lui appliquer un certain filtre passe-haut/bas, ensuite de tamiser les valeurs selon leurs amplitudes, conserver seulement les valeurs positives/négatives et finalement d'ajouter cette transformation à l'image initiale pour obtenir des résultats intéressants. Dans l'ensemble, ces opérations demandent peu de temps de calcul et peuvent donc être faites en temps réel sur un flux vidéo. Le projet n'a pas été jusqu'à faire du temps réel, mais les résultats ont été reproduits sur un grand nombre d'images aux caractéristiques variées.
Dans cette section, les détails des filtres et de tamisage appliqué sur l'image seront expliqués.
Contrairement à tous les projets faits dans ce cours, la représentation RGB n'a pas été utilisée. Pour ce travail, l'idée est de manipuler la luminance de chaque pixel et la meilleure représentation de celle-ci est donné dans l'espace de couleur CIE lab. Pour faire simple, chacun des pixels est alors représenté par un vecteur de 3 dimensions, L pour la luminance, A pour les chrominances de vert à rouge et B pour les chrominances de bleu à jaune. Les détails exacts pour la gestion de la chrominance m'échappent. Dans le contexte, ces détails ne sont vraiment pas pertinents. Nous n'utiliserons que la dimension de la (L)uminance. Voici une représentation plus imagée de l'espace de couleur CIE lab:
La publication n'est pas précise sur le type de filtre à utiliser. Mais avant de parler de filtre, il est important d'appliquer une manipulation de contraste local sensible aux contours des images. La méthode localcontrast
fait se travail efficacement et sans trop poser de questions. Ensuite, il est possible d'appliquer un filtre linéaire passe-bas classique tel qu'un filtre gaussien. Pour obtenir un filtre passe-haut, il suffit de faire 1 - Fpasse-bas
. Voici une représentation des filtres utilisés:
Fpasse-bas size = 50 sigma = 7 |
Fpasse-haut size = 50 sigma = 7 |
Ce qui peut être intéressant c'est de regarder la distribution des valeurs suite au filtrage. Comme on peut voir dans les figures de plot, la distribution semble segmentée en deux zones pour les basses fréquences. Une zone entre 0 et 10 et une autre entre 40 et 70. Cette séparation n'est absolument pas présente avec les hautes fréquences. C'est tout à fait normal, le filtre passe-haut est un filtre qui élimine les valeurs "DC". Donc, il normalise les valeurs à zéro. Nous allons alors jouer avec ces valeurs.
Le tamisage en amplitude est une méthode empirique de filtrage sur la distribution des amplitudes de chaque pixel en valeur absolue. Le paramètre sera δ pour le threashold. Comme mentionné plus haut, les valeurs ne sont pas distribuées de façon uniforme et il est possible de tamiser ces deux groupes pour ajuster le bruit de l'image. En termes de programmation, il s'agit de garder ou non un pixel s'il est plus grand que telle amplitude en valeur absolue. La valeur d'un pixel qui n'est pas conservée est zéro. Note: Cette étape est réalisée seulement sur les hautes fréquences.
mean(mean(abs( varHF ))) = 3.5581 Valeur utilisée δ = 4 |
Après cette étape, trois images ont été créées à partir de l'image d'origine.
Exactement comme le tamisage en amplitude, ici, l'idée c'est de tamiser la décomposition entre les valeurs positives et les valeurs négatives. La procédure est appliquée sur les images de hautes et de basses amplitudes.
Cette dernière étape donne alors 5 images qui peuvent être utilisées comme outils de modification d'une image.
C'est ici que l'art commence. Pour présenter de façons claire et consise les images utilisées dans le procédé de modification d'une image, un code de trois lettres est utilisé. La première lettre c'est pour le choix de filtre passe (H)aut ou (L)Bas. La deuxième pour les (H)autes ou (L)basses amplitudes, la lettre (A) pour tous est aussi utilisable. Et finalement, (P)ositif, (N)égatif ou (A)ll comme dernier critère. Donc par exemple, le code HHP
veut dire hautes-fréquences, hautes-amplitudes et les valeurs positif. Les derniers paramètres de l'algorithme sont le facteur de multiplication λ et s'il s'agit d'une multiplication ou d'une addition.
Chaque résultat a des paramètres différents qui seront indiqués clairement. Pour récapituler, il y a:
Le point d'entré de code est main.m
La procédure de la publication suivie était plutôt simple à implanter, mais la difficulté du projet vient lors de la création des résultats. Il n'y a pas de solution parfaite toute les images et il est toujours possible d'ajuster les paramètres pour obtenir de meilleurs résultats. Dans ce projet, la taille du filtre est restée constante afin de réduire et de stabiliser une des variables. Malgré cette limitation auto-imposée, les résultats ressemblent beaucoup à ceux de la documentation fournie avec la publication. D’ailleurs, la plupart des résultats qui ont été créés pour ce projet utilisent des images de la publication. Si le projet avait eu plus de temps, l'utilisation d'un flux vidéo comme entré aurait pus être testée. Ainsi, les performances en temps réel auraient été prouvées.