Date de remise: 12 février 2025 à 23h59Due date: February 12 2025, 23h59
Partie 0: Réchauffement (10% pour 4105, 5% pour 7105)
Dans ce travail, vous aurez à implanter différents algorithmes. Ces algorithmes ont tous comme thème la manipulation d'images dans le domaine des fréquences. En guise de réchauffement, sélectionnez deux images de votre choix et accentuez leurs détails en utilisant la technique de l'accentuation (sharpening, ou unsharp masking).
Dans ce TP, nous vous recommandons d'utiliser des fonctions pour filtrer les images, comme skimage.filters.gaussian ou scipy.ndimage.gaussian_filter). Votre code sera ainsi beaucoup plus simple que si vous utilisiez des transformées de Fourier.
Créez un fichier nommé main_accentuation.py qui exécute cette partie du TP.
Part 0: Warmup (10% for 4105, 5% for 7105)
For this homework, you will implement different algorithms. These algorithms have image manipulation in the frequency domain as a common thread. As a warmup, pick two images of your choice; sharpen them using the unsharp masking technique shown in class.
In this homework, we recommend you use image filtering functions such as skimage.filters.gaussian or scipy.ndimage.gaussian_filter. This will be a lot simpler than Fourier Transforms.
Create a file main_accentuation.py which executes this part of the homework.
Partie 1: Images hybrides (30% pour 4105, 25% pour 7105)
Survol
Le but de cette section est de créer des images hybrides en utilisant l'approche décrite dans cet article de SIGGRAPH 2006 écrit par Oliva, Torralba et Schyns. Les images hybrides sont des images dont l'interprétation dépend de la distance entre l'image et l'observateur. Dans une image, l'information à haute fréquence tend à être plus perceptible de près, tandis que seulement le signal à basses fréquences peut être perceptible de loin. En mélangeant le contenu à hautes fréquences d'une image avec le contenu à basses fréquences d'une autre, vous pouvez obtenir une image dont l'interprétation varie selon la distance d'observation !
Détails
Utilisez ce code pour débuter. Le code ne fait que lire deux images et les aligne par la suite. L'alignement est important puisque celui-ci affecte le groupement perceptuel (voir l'article).
Tout d'abord, débutez avec les deux images (Marilyn et Einstein) incluses avec le code ci-haut pour tester votre algorithme.
L'approche consiste à filtrer une image avec un filtre passe-bas, filtrer une autre image avec un filtre passe-haut, et ensuite additionner le résultat des filtres (ou en calculer la moyenne). Pour le filtre passe-bas, Oliva et al. suggèrent l'utilisation d'un filtre 2D gaussien standard. Pour le filtre passe-haut, ils suggèrent l'utilisation d'un filtre à impulsion moins le filtre gaussien (ce qui peut être calculé en soustrayant l'image filtrée avec le filtre gaussien de l'image originale). Vous pouvez choisir la fréquence de coupure de chaque filtre mentionnée dans l'article manuellement, par essai et erreur. Expérimentez !
Trouvez ensuite une autre paire d'images (en niveaux de gris) de votre choix et générez une image hybride.
Illustrez le procédé sur votre résultat préféré en utilisant une analyse fréquentielle. Affichez l'amplitude logarithmique de la transformée de Fourier des deux images initiales, des deux images filtrées, et de l'image hybride. En python, vous calculer la transformée de Fourier 2D avec:
np.log(np.abs(np.fft.fftshift(np.fft.fft2(gray_image)))).
Crédits supplémentaires
(2% par résultat, max 6%) Générez une image hybride en couleur. Pour quelle(s) composantes (passe-haut, passe-bas, les deux) est-ce que l'utilisation de la couleur améliore l'effet ?
(2% par résultat, max 6%) Essayez de créer différents types d'images hybrides (changement d'expression, du morphage entre différents objets, changement dans le temps, etc.)
(2% par résultat, max 6%) Créez des images hybrides à partir de vos propres photos ! Indiquez clairement que ce sont vos propres photos dans le rapport.
Livrables
Pour cette section, incluez les résultats suivants dans votre rapport:
(10%) Votre image hybride pour la paire d'images fournie (Einstein-Marilyn) ainsi que pour la paire d'images de votre choix. Décrivez et commentez vos résultats. Si vous prenez des images sur Internet, n'oubliez pas de citer vos sources.
(20% pour 4105, 15% pour 7105) Illustration détaillée de l'analyse fréquentielle pour votre résultat préféré.
(N%) Description des crédits supplémentaires que vous aurez implémentés.
Créez un fichier nommé main_hybride.py qui exécute cette partie du TP.
Part 1: Hybrid Images (30% for 4105, 25% for 7105)
Overview
The goal of this part of the assignment is to create hybrid images using the approach described in the SIGGRAPH 2006 paper by Oliva, Torralba, and Schyns. Hybrid images are images that change in interpretation as a function of the viewing distance. The basic idea is that high frequency tends to dominate perception when it is available, but, at a distance, only the low frequency part of the signal can be seen. By blending the high frequency portion of one image with the low-frequency portion of another, you get a hybrid image that leads to different interpretations at different distances.
Details
We are providing you with Python starter code that can be used to load two images and align them. The alignment is important because it affects the perceptual grouping (read the paper for details).
First, start by using the images included with the code (Marilyn and Einstein) to test your algorithm.
You will need to write code to low-pass filter one image, high-pass filter the second image, and add (or average) the two images. For a low-pass filter, Oliva et al. suggest using a standard 2D Gaussian filter. For a high-pass filter, they suggest using the impulse filter minus the Gaussian filter (which can be computed by subtracting the Gaussian-filtered image from the original). The cutoff-frequency of each filter should be chosen manually, by trial and error. Experiment!
Find another pair of images of your choice (in grayscale) and generate another hybrid image.
For your favorite result, illustrate the process through frequency analysis. Show the log magnitude of the Fourier transform of the two input images, the filtered images, and the hybrid image. In python, you can compute the 2D Fourier transform with:
np.log(np.abs(np.fft.fftshift(np.fft.fft2(gray_image))))
Extra credit
(2% per result, max 6%) Try using color to enhance the effect. Does it work better to use color for the high-frequency component, the low-frequency component, or both?
(2% per result, max 6%) Try creating a variety of types of hybrid images (change of expression, morph between different objects, change over time, etc.)
(2% per result, max 6%) Create hybrid images from your own photos! Clearly indicate that the photos are yours in your report.
Deliverables
For this section, include the following results in your report:
(10%) Your hybrid image for the pair of images provided (Einstein-Marilyn) and for the pair of images of your choosing. Describe and comment on your results. If you use images found on the Internet, don't forget to cite your sources.
(20% for 4105, 15% for 7105) Detailed illustration of the frequency analysis for your favorite result.
(N%) Description of any of the extra credit you've chosen to implement.
Create a file main_hybride.py which executes this part of the homework.
Partie 2: Piles gaussienne et laplacienne (30% pour 4105, 25% pour 7105)
Pile gaussienne pour l'image hybride « Einstein-Marilyn »
Survol
Dans cette section, vous devez implanter des piles gaussiennes et laplaciennes; celles-ci sont comme les pyramides, mais sans le sous-échantillonnage (redimensionnement). Ensuite, vous utiliserez ces piles pour analyser des images, ainsi que vos images hybrides de la partie 1.
Détails
Implémentez la décomposition d'une image en une pile gaussienne et une pile laplacienne. La différence entre une pile et une pyramide est la façon dont les images sont conservées; à chaque niveau d'une pyramide, l'image est sous-échantillonnée, et donc les résultats deviennent de plus en plus petits. Dans une pile, les images ne sont pas sous-échantillonnées: les résultats ont donc la même taille à chaque niveau et peuvent être conservés dans une matrice 3D (si l'image originale est en tons de gris) ce qui simplifie l'implémentation. Puisque l'image n'est pas redimensionnée, il faut utiliser un filtre gaussien de plus en plus large à chaque niveau. Une bonne habitude à prendre est de doubler le sigma à chaque niveau de la pile (e.g. sigma = 2,4,8,16...), et de toujours générer les images de la pile à partir de l'image originale. De cette façon, nous obtiendrons une pile similaire à une pyramide qui aurait été sous-échantillonnée de la moitié de sa taille à chaque niveau.
Appliquez vos piles gaussienne et laplacienne à des images intéressantes contenant des informations à plusieurs résolutions comme la peinture « Lincoln et Gala » de Salvador Dali. Affichez vos piles calculées à partir de ces images pour découvrir la structure à chaque résolution.
Illustrez le processus de création d'image hybride que vous avez implanté à la partie 1 en appliquant vos piles gaussienne et laplacienne et en les affichant pour votre résultat préféré. Ce résultat devrait être similaire à la figure 7 dans l'article de Oliva et al.
Crédits supplémentaires
(Jusqu'à 5%) Implémentez une pyramide plutôt qu'une pile.
Vous n'êtes PAS autorisés à utiliser les fonctions python skimage.transform.pyramid_gaussian, ou skimage.transform.pyramid_laplacian, ou toute autre fonction équivalente. Vous devez coder votre pyramide vous-même !
Illustrez chaque image de votre pyramide à la résolution de l'image originale. Est-ce que vos images ressemblent à celles des piles ? Quel est l'intérêt d'utiliser une pyramide au lieu d'une pile ?
Livrables
Pour cette section, incluez les résultats suivants dans votre rapport:
(15% pour 4105, 10% pour 7105) Affichez vos piles gaussienne et laplacienne pour l'image « Lincoln et Gala » de Dali.
(15%) Affichez vos piles gaussienne et laplacienne pour votre image hybride préférée de la section précédente. Décrivez et commentez vos résultats.
(N%) Description des crédits supplémentaires que vous aurez implémentés.
Créez un fichier nommé main_pile.py qui exécute cette partie du TP.
Part 2: Gaussian and Laplacian Stacks (30% for 4105, 25% for 7105)
Gaussian stack for the "Einstein-Marilyn" hybrid image
Overview
In this part you will implement Gaussian and Laplacian stacks, which are kind of like pyramids but without the downsampling. Then you will use these to analyze some images, and your hybrid images from part 1.
Details
Implement a Gaussian and a Laplacian stack. The different between a stack and a pyramid is that in each level of the pyramid the image is downsampled, so that the result gets smaller and smaller. In a stack the images are never downsampled so the results are all the same dimension as the original image, and can all be saved in one 3D matrix (if the original image was a grayscale image) which simplifies your implementation. Note that there is one subtlety here: since we are not downsampling the image, we must use a larger and larger sigma for the Gaussian filtering at each level. A good rule of thumb is to double the sigma at each level of the pyramid (e.g. sigma = 2,4,8,16...), and to always use the resulting Gaussian filter on the original image. In this way we will get a stack that behaves similarly to a pyramid that was downsampled to half its size at each level.
Apply your Gaussian and Laplacian stacks to interesting images that contain structure in multiple resolution such as paintings like the Salvador Dali painting of Lincoln and Gala. Display your stacks computed from these images to discover the structure at each resolution.
Illustrate the process you took to create your hybrid images in part 1 by applying your Gaussian and Laplacian stacks and displaying them for your favorite result. This should look similar to Figure 7 in the Oliva et al. paper.
Extra credit
(Up to 5%) Implement your work with pyramids instead of stacks.
You are NOT allowed to use skimage.transform.pyramid_gaussian, or skimage.transform.pyramid_laplacian or any of their equivalents for this. You must implement your pyramids by yourself from scratch!
Show each image from your pyramid at the same resolution than the original image. Are the images similar to the ones from the stacks? What's the point of using pyramids instead of stacks?
Deliverables
For this section, include the following results in your report:
(15% for 4105, 10% for 7105) Show your Gaussian and Laplacian stacks for the "Lincoln and Gala" image from Salvador Dali.
(15%) Show your Gaussian and Laplacian stacks for your favorite hybrid image from the previous section. Describe and comment on your results.
(N%) Description of any of the extra credit you've chosen to implement.
Create a file main_pile.py which executes this part of the homework.
Partie 3: Mélange multirésolution (30%)
Survol
Le but de cette partie du travail est de mélanger harmonieusement deux images en utilisant la technique de mélange multirésolution décrite dans cet article de 1983 par Burt et Adelson. Le « mélange multirésolution » calcule une bordure entre les deux images indépendamment à chacune des bandes de fréquence de l'image ce qui résulte en une bordure beaucoup plus lisse.
Détails
Tout d'abord, utilisez les deux images d'exemple fournies (pomme et orange) et générez une « pommange » tel qu'illustré ci-haut. Pour ces images, un joint vertical au milieu de l'image suffira. Pour ce faire, utilisez la technique de mélange d'images basée sur les piles laplaciennes, comme dans les notes de cours. N'oubliez pas de créer une pile gaussienne pour le masque, et une pile laplacienne pour les deux images.
Lorsque votre code fonctionnera et que vous parviendrez à créer votre propre « pommange », sélectionnez des images de votre choix pour les mélanger en utilisant un masque irrégulier, comme illustré à la figure 8 de l'article.
Illustrez le procédé en appliquant votre pile laplacienne et en l'affichant pour votre résultat préféré ainsi que l'image d'entrée avec masque qui l'a créé. Cela devrait ressembler à la figure 10 de l'article.
Attention : si vous trouvez que votre résultat est trop sombre, c'est probablement parce que vous avez oublié de conserver les basses fréquences de votre pile laplacienne...
Crédits supplémentaires
(Jusqu'à 20%) Implantez le transfert de style pour les portraits de visage de cet article de SIGGRAPH 2014 par Shih et al. Vous serez étonnés de voir tout ce qu'on peut faire avec des piles gaussiennes et laplaciennes!
Livrables
Pour cette section, incluez les résultats suivants dans votre rapport.
(10%) Un mélange d'images de votre choix en utilisant des masques irréguliers (comme la figure 8 de l'article). Laissez place à votre imagination et amusez-vous (mais n'oubliez pas de citer vos sources)! Montrez les images originales, le masque, et le résultat. Décrivez et commentez vos résultats.
(5%) Un mélange d'images sur vos propres photos ! Montrez les images originales, le masque, et le résultat. Décrivez et commentez vos résultats.
Pour récapituler : vous devez nous fournir trois (3) résultats: la « pommange », au moins un doit avoir un masque irrégulier et au moins un autre doit utiliser vos propres photos.
(10%) Illustration détaillée du procédé (comme la figure 10 de l'article) pour votre résultat préféré.
(N%) Description des crédits supplémentaires que vous aurez implémentés.
Créez un fichier nommé main_melange.py qui exécute cette partie du TP.
Part 3: Multiresolution blending (30%)
Overview
The goal of this part of the assignment is to blend two images seamlessly using a multi resolution blending as described in the 1983 paper by Burt and Adelson. "Multiresolution blending" computes a gentle seam between the two images seperately at each band of image frequencies, resulting in a much smoother seam.
Details
First, use the example images provided (apple and orange) to generate the "orple" as seen above. In this case, a vertical seam is sufficient. To do so, use the laplacian stack image blending method, just like in the class notes. Do not forget to create a gaussian stack for the mask, and laplacian stacks for the two images.
Now that your code works and that you've made yourself an "orple", select images of your choice to blend together with an irregular mask, as is demonstrated in figure 8 in the paper.
Illustrate the process by applying your Laplacian stack and displaying it for your favorite result and the masked input images that created it. This should look similar to Figure 10 in the paper.
Be careful: if your result looks too dark, it is likely because you forgot to keep the low frequencies in your laplacian stack...
Extra credit
(Up to 20%) Implement Style transfer for headshot portraits from this exciting SIGGRAPH 2014 paper by Shih et al. It's amazing to see just how far Gaussian and Laplacian stacks can take you!
Deliverables
For this section, include the following results in your report:
(5%) Your "orple". Briefly describe your approach.
(10%) One blending result on images of your choice obtained with irregular masks (as fig. 8 in the paper). Let your imagination run free, and have fun (but don't forget to cite your sources)! Show the original images, the mask, and the result. Describe and comment on your results.
(5%) One blening result on your own photos! Show the original images, the mask, and the result. Describe and comment on your results.
In short: you must provide three (3) results: your "orple", at least one with an irregular mask, and at least one must showcase your own photos.
(10%) Detailed illustration of your approach (as fig. 10 in the paper) for your favorite result.
(N%) Description of any of the extra credit you've chosen to implement.
Create a file main_melange.py which executes this part of the homework.
Remise
Pour la remise de votre travail, créez un fichier tp2.zip qui contient:
Votre rapport en format HTML dans un dossier tp2/web. Vos images doivent être dans un dossier tp2/web/images.
Votre page principale doit être tp2/web/index.html. De plus, assurez-vous qu'il n'y a aucun caractère spécial (accent, ponctuation, espace, etc.) dans les noms de vos fichiers, images, etc.
Votre code doit être dans un dossier tp2/code. N'incluez pas les images que vous avez utilisées pour produire vos résultats dans ce dossier dans le but de ne pas alourdir le fichier.
Finalement, téléversez votre fichier tp2.zip sur le portail des cours avant la date limite. La politique des retards mentionnée dans le plan de cours sera appliquée. Pour toutes questions concernant la procédure de remise ou le travail lui-même, posez vos questions sur PAX!
Attention! La taille limite permise sur le portail des cours est de 250MB.
Handing in procedure
For this homework, you must create a tp2.zip file. In this file you'll put:
Your report in an HTML format inside a folder named tp2/web. Your images for this web page should be inside a folder named tp2/web/images.
Your main page has to be tp2/web/index.html. Make sure none of the files have special characters (e.g. accents, punctuation, spaces, etc.) in their filenames.
Your code should be put inside the folder tp2/code. Do not include the images you have used to generate your results inside this folder, as this will likely generate huge files.
Finally, upload this file (tp2.zip) on the "portail des cours" before the deadline. The late submission policy described in the course plan will be applied. For any question regarding the submission process or the project as such, ask your questions on PAX!
Beware! File size limit on the "portail" is 250MB.
Remerciements
Merci à Alyosha Efros d'avoir créé le TP original ayant servi d'inspiration pour celui-ci!
Thanks
Many thanks to Alyosha Efros for the original version of this assignment!