Date de remise: 17 février 2021 à 23h59Due date: February 17 2021, 23h59
Partie 0: Réchauffement (10%, 5% pour les gradués)
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»).
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%, 5% for the grads)
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%, 25% pour les gradués)
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 statiques 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 à basse-fréquence 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 incluses avec le code pour tester vos algorithmes. Lorsque vous serez en mesure d'obtenir des résultats similaires à celui illustré ci-haut, vous pourrez tester votre code sur d'autres images. Vous pouvez utiliser des images en niveaux de gris.
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). La fréquence de coupure de chaque filtre mentionnée dans l'article doit être choisie à la main, par essai et erreur. Expérimentez!
Sélectionnez votre résultat préféré, et identifiez-le dans votre rapport. 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 pouvez afficher la transformée de Fourier 2D avec:
plt.imshow(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:
(5%) Votre image hybride pour la paire d'images fournie (Einstein-Marilyn).
(10%) Vos images hybrides avec un minimum de 2 paires d'images additionnelles. Au total, vous devrez donc nous montrer 3 résultats (paire fournie, 2 paires supplémentaires). Vous pouvez utiliser des images en niveaux de gris, et n'oubliez pas de citez vos sources.
(15%, 10% pour les gradués) 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, n'oubliez pas de montrer les images « avant et après »!
Créez un fichier nommé main_hybride.py qui exécute cette partie du TP.
Part 1: Hybrid Images (30%, 25% for grads)
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 static 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 (smooth) 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 (Matlab/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 to test your algorithms. When you're able to obtain results similar to the ones shown above, you can then test your code on other images. You can use grayscale images.
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 with some experimentation.
Select your favorite result and identify it in your report. For this favorite result of yours, 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 and display the 2D Fourier transform with:
plt.imshow(np.log(np.abs(np.fft.fftshift(np.fft.fft2(gray_image)))))
Bells & Whistles (Extra Points)
(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:
(5%) Your hybrid image for the pair of images provided.
(10%) Your hybrid images for a minimum of 2 image pairs. In total, you'll thus have to show us at least 3 results (provided pair, 2 extra pairs). You can use grayscale images, and don't forget to cite your sources.
(15%, 10% for grads) Detailed illustration of the frequency analysis for your favorite result.
(N%) Description of any of the bells & whistles you've chosen to implement. Don't forget to show the "before and after" images!
Create a file main_hybride.py which executes this part of the homework.
Partie 2: Piles gaussienne et laplacienne (30%, 25% pour les gradués)
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 résultats de la première partie.
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). 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êmes! 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%, 10% pour les gradués) 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.
(N%) Description des crédits supplémentaires que vous aurez implémentés, n'oubliez pas de montrer les images « avant et après »!
Créez un fichier nommé main_pile.py qui exécute cette partie du TP.
Part 2: Gaussian and Laplacian Stacks (30%, 25% for the grads)
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 results 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). 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.
Bells & Whistles (Extra Points)
(Up to 5%) Implement your work with pyramids instead of stacks. However, 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 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%, 10% for grads) 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.
(N%) Description of any of the bells & whistles you've chosen to implement. Don't forget to show the "before and after" images!
Create a file main_pile.py which executes this part of the homework.
Partie 3: Mélange multirésolution (30%, 25% pour les gradués)
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.
Implémentez 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.
Crédits supplémentaires
(Jusqu'à 5%) Essayez d'utiliser de la couleur pour augmenter l'effet.
(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%) Deux résultats de mélange d'images obtenus avec 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 minimum de deux résultats de mélange d'images obtenus avec vos propres photos! Montrez les images originales, le masque, et le résultat. Décrivez et commentez vos résultats.
(10%, 5% pour les gradués) Illustration détaillée du procédé (comme la figure 10 de l'article) pour votre mélange préféré.
(N%) Description des crédits supplémentaires que vous aurez implémentés, n'oubliez pas de montrer les images « avant et après »!
Créez un fichier nommé main_melange.py qui exécute cette partie du TP.
Part 3: Multiresolution Blending (30%, 25% for the grads)
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.
Then you will need to implement the approach proposed in the paper and use your Gaussian and Laplacian stacks from part 2 in order to blend the images together. Since we are using stacks instead of pyramids like in the paper, the algorithm described on page 226 will not work as-is. If you try it out, you will find that you end up with a very clear seam between the apple and the orange since in the pyramid case the downsampling/blurring/upsampling hoopla ends up blurring the abrupt seam proposed in this algorithm. Instead, you should always use a mask as is proposed in the algorithm on page 230, and remember to create a Gaussian pyramid for your mask image as well as for the two input images. The Gaussian blurring of the mask in the pyramid will smooth out the transition between the two images. For the vertical or horizontal seam, your mask will simply be a step function of the same size as the original 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.
Bells & Whistles (Extra Points)
(Up to 5%) Try using color to enhance the effect.
(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%) A minimum of three blending results 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. Comment.
(5%) A minimum of two blending results obtained on your own photos! Show the original images, the mask, and the result. Comment.
(10%, 5% for grads) Detailed illustration of your approach (as fig. 10 in the paper) for your favorite blending result.
(N%) Description of any of the bells & whistles you've chosen to implement. Don't forget to show the "before and after" images!
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, veuillez téléverser 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, you should 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.