TP2: On s'amuse en fréquences

Carl Nadeau 2017

Description du projet

Dans ce deuxième travail personnel, nous explorons comment on peut manipuler les différentes fréquences d'une image pour en composer de nouvelles.
On combine et filtre beaucoup!

Numéro 0 : Réchauffement


Dans le code, on retrouve le principe de calcul pour accentuer l'image, en augmentant la force des bordures.

J'utilise la fonction [imgOut] = sharpening(imgRAW,alpha) dans le fichier main0.m pour produire les résultats.
Pour effectuer le calcul, on soustrait un montant des basses fréquences de l'image pour augmenter l'apparence des hautes.
J'utilise des images de ma collection personnelle.

Images demandées
Ici notre coeficiant alpha est de 80%
Ici notre coeficiant alpha est de 80% aussi

Partie 1: Images hybrides


Dans le code, on retrouve le fichier main1.m qui utilise la fonction [imgHybrid] = hybridImage(imgLow, imgHigh, sigma, hs) .

J'utilise la fonction [imgHybrid] = hybridImage(imgLow, imgHigh, sigma, hs) pour produire les résultats.
Pour effectuer le calcul, la fonction convertit les deux images en domaine fréquentiel. Puis on les filtre un avec un filtre laplacien et, l'autre, avec un filtre gaussien.
Le filtre laplacien est fabriqué dans le domaine spatial en soustrayant le filtre gaussien à 1 (1-filtre gaussien).
J'utilise des images de google image majoritairement et des extraits de vidéo YouTube.
J'ai tenté d'effectuer un montage intéressant en prenant des scènes qui changeaient peu. À vous d'en conclure les résultats.

Images demandées
Image Hybride
Le sigma est de 9
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : tp2
images originales 1 et 2
Image Hybride
Le sigma est de 3
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : google image
images originales 1 et 2
Image Hybride
Le sigma est de 4
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : google image
images originales 1 et 2
Image Hybride
Le sigma est de 4
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : google image
images originales 1 et 2
Image Hybride
Le sigma est de 4
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : google image

Images supplémentaire
images originales 1 et 2
Image Hybride
Le sigma est de 4
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : google image
images originales 1 et 2
Image Hybride
Le sigma est de 10
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : youtube
images originales 1 et 2
Image Hybride
Le sigma est de 10
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : youtube
images originales 1 et 2
Image Hybride
Le sigma est de 7,5
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : youtube
images originales 1 et 2
Image Hybride
Le sigma est de 5
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : youtube
images originales 1 et 2
Image Hybride
Le sigma est de 2
Image filtrée passe bas(spectre), image filtrée passe haut(spectre)
image construite(spectre), image construite
source : youtube

Il est intéressant de noter que beaucoup d'images possèdent beaucoup d'information sur des diagonales. Cela est dû au fait que plusieurs images ont été alignées avec leurs correspondantes. Je trouvais sympathique de garder les bordures.

Partie 2: Piles gaussienne et laplacienne

J'utilise la fonction [p] = pile(img, nb, type) dans le fichier main2.m pour produire les piles suivantes. On peut mentionner si on désire une pile laplacienne ou gaussienne. On peut aussi ajuster le nombre d'images dans la pile. Le sigma pour chaque itération est multiplié par deux et la dimension de la fenêtre est toujours le triple de sigma.
Il est intéressant de constater que les piles laplaciennes contiennent les informations à haute fréquence dans l'image et les gaussiennes, les basses.
On voit Gala le mieux quand sigma est de 16 pour le laplacien. Lincoln est très clair à 16 aussi, selon mes observations.

Lincoln et Gala
sigma = 1 sigma = 2 sigma = 4 sigma = 8 sigma = 16 sigma = 32

Kojimads
sigma = 1 sigma = 2 sigma = 4 sigma = 8 sigma = 16 sigma = 32

J'ai choisi l'image de "Kojimads" et c'est en combinant les sigma à 4 que j'ai construit mon image.

Partie 3: Mélange multirésolution

J'utilise encore ma fonction [p] = pile(img, nb, type),mais dans le fichier main3.m. Tout le nouveau code est dans le main3.m.
Ici, le masque est construit manuellement séparant l'image en deux. Par la suite, on multiplie les images de chaque pile par son gain. Le gain, c'est en fait la valeur du masque filtré à un sigma donné. On multiplie le masque pour une image et l'opposé du masque pour l'autre. Ensuite on peut les additionner ensemble. On ajoute aussi la valeur en basse fréquence pour la couleur et les surfaces uniformes.

J'ai rencontré plusieurs problèmes en codant et encore, j'ai des problèmes que je n'ai pas réglés encore.
Le plus important, c'est qu'après un filtrage à très grande fenêtre (et grand alpha), mon masque et mes images se décalent vers la droite et le bas. J'aimerais implanter une translation qui replace le masque au bon endroit.
Aussi, j'ai de la difficulté à "faire fondre" les frontières. Il s'agirait de donner moins d'importance à la composante de basse fréquence à très faible alpha. J'aimerais utiliser le masque pour pouvoir gérer la situation.

Pommange
mélange multirésolution
Le sigma initiale de 1
Image avec Masque, mélange multirésolution source : tp2

J'utilise une fonction modifiée de pile : [p] = pileS(img, nb, type),mais dans le fichier main3roi.m, pour pouvoir lui donner des sigmas de départ plus rapidement. Tout le nouveau code est dans le main3roi.m. Ici, je généralise la construction du masque avec région d'intérêt (RoI). Ça fonctionne bien.

Kojimads 2
mélange multirésolution
Le sigma initiale de 1
Image avec Masque, mélange multirésolution source : google image (Kojima et Mads)

Los Angeles dans le sable
mélange multirésolution
Le sigma initiale de 1
Image avec Masque, mélange multirésolution source : personnelle

Pêche
mélange multirésolution
Le sigma initiale de 1
Image avec Masque, mélange multirésolution source : personnelle

Partie 3.1: les portraits de visage

J'utilise encore ma fonction [p] = pileS(img, nb, type),mais dans le fichier main31.m. Tout le nouveau code est dans le main31.m et je tente de reproduire l'effet que les gars du MIT on fait.
Je construis mes piles comme à l'habitude. Par contre, je me crée des images d'énergie (gain) pour trouver les différences à ajouter d'une image à l'autre. Je fais la racine sur le ratio des deux gains et je multiplie le résultat à mon image local sur ma pile laplacienne.
On peut voir que l'algorithme tente de transférer le style d'une image à l'autre, mais il y a beaucoup d'artefacts. C'est plus un générateur d'image artistique.

Un de mes gros problème, c'est que je n'ai pas de wrapper sur mes images, alors elles peuvent être trop différentes. Aussi, il faut du 'tunage' de sigma pour produire de belles piles. Peut-être aussi que mes images sont à trop faible résolution.

Kojimads 3
mélange multirésolution
Le sigma initiale de 7, avec 5 piles
Image du dernier Match, mélange de style images bonus source : google image (Kojima et Mads)

L'éclairage provenant d'en arrière à 45 degrée est partiellement transferer. Aussi, on remarque que derrière ça tête à gauche, Kojima a le halo de lunmière de Mads. Il y a plus de reflet dans ses lunettes aussi.

Kojimads pop art

Sea Fishing
mélange multirésolution
Le sigma initiale de 7, avec 5 piles
Image du dernier Match, mélange de style images originales. source : personnelle

Conclusion

La plupart des sections m'ont donné de bons résultats, mais mes algorithmes ont encore les défauts décrient dans la section 3.
J'ai joué en fréquences.