TP2: On s'amuse en fréquences (English version) Posez une question !

HW2: Fun with frequencies (Version française) Ask us a question!

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).

  1. Tout d'abord, débutez avec les deux images (Marilyn et Einstein) incluses avec le code ci-haut pour tester votre algorithme.
  2. 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 !
  3. Trouvez ensuite une autre paire d'images (en niveaux de gris) de votre choix et générez une image hybride.
  4. 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

Livrables

Pour cette section, incluez les résultats suivants dans votre rapport:

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).

  1. First, start by using the images included with the code (Marilyn and Einstein) to test your algorithm.
  2. 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!
  3. Find another pair of images of your choice (in grayscale) and generate another hybrid image.
  4. 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

Deliverables

For this section, include the following results in your report:

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

  1. 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.
  2. 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.
  3. 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

Livrables

Pour cette section, incluez les résultats suivants dans votre rapport:

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

  1. 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.
  2. 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.
  3. 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

Deliverables

For this section, include the following results in your report:

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

  1. 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.
  2. 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.
  3. 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

Livrables

Pour cette section, incluez les résultats suivants dans votre rapport.

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

  1. 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.
  2. 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.
  3. 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

Deliverables

For this section, include the following results in your report:

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:

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:

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!

Retour à la page web du cours.

Back to the class webpage.