Implémenter de façon naïve les transformées de Fourier discrètes
en deux dimensions et comprendre leur utilité en traitement d'image.
Puis comparer les performances de votre implémentation avec
cellee de la librairie `numpy`.
en deux dimensions avec pour but:
1. Tenter de comprendre leur utilité en traitement d'image.
2. Tenter de comprendre leur utilité en compression d'image.
# Les transformées de Fourier en plusieurs dimensions
...
...
@@ -63,17 +64,24 @@ séparément.
De même la transformée de Fourier inverse à deux dimensions s'écrit
$$
f[n_1,n_2]=\sum_{k_1=0}^{N_1-1} e^{\frac{2\pi i n_1 k_1}{N_1}}\left(\sum_{k_2=0}^{N_2-1} {\hat{f}}[k_1,k_2] e^{\frac{2\pi i n_2 k_2}{N_2}}\right).
f[n_1,n_2]=\frac{1}{N_1\cdot N_2}\sum_{k_1=0}^{N_1-1} e^{\frac{2\pi i n_1 k_1}{N_1}}\left(\sum_{k_2=0}^{N_2-1} {\hat{f}}[k_1,k_2] e^{\frac{2\pi i n_2 k_2}{N_2}}\right).
$$
Souvenez-vous qu'on a vu que la transformée de Fourier discrète et son inverse peuvent s'écrire sous la forme
d'un produit matrice vecteur. Cela peut vous aider à rendre votre code plus performant en
utilisant les fonctionnalités de la librairie `numpy`.
On peut donc faire une analyse de Fourier d'une image presque aussi facilement qu'on le ferait pour un signal unidimensionnel.
# Travail à réaliser
Dans ce travail, vous avez un cahier des charges relativement peu précis.
Dans ce travail, vous avez un cahier des charges relativement peu précis. Vous devez vous débrouiller pour atteindre un
but fixé, mais le chemin est assez peu balisé.
C'est à dessein. On peut discuter oralement de chaque partie si vous voulez vous assurer de ce que vous devez faire, mais je ne veux
pas trop vous cadrer et vous laisser vous débrouiller.
En résumé, il faudra à l'aide des transformées de Fourier discrètes filtrer une image. Puis écrire un algorithme
permettant de la compresser/décompresser (avec pertes).
## Implémenter les fonctions `tfd()` et `tdfi()`
Il s'agit d'écrire une fonction vous même pour calculer la transformée de Fourier discrète à une, puis à deux dimensions (`tfd()` et `tdf2()` respectivement). Pensez
...
...
@@ -91,14 +99,15 @@ En d'autres termes, la transformée de Fourier inverse de la transformée
de Fourier d'un signal, doit donner le signal lui-même.
Vous pouvez également comparer vos résultats avec les fonctions `ifft()`{.language-python}
et `ifft2()`{.language-python} de `numpy`.
## Filtrer les images
## Filtrage de bruit
Sur `cyberlearn`, vous trouverez un certain nombre d'images
très bruitées. Dans chacun d'entre elles, se trouve caché
une personnalité. Il s'agit ici de trouver laquelle.
Sur `cyberlearn`, vous trouverez dans un premier temps **une seule image**
très bruitée nommée `cache.png`. Tapie dans le bruit, une personnalité est cachée prête à bondir.
Il s'agit ici de trouver laquelle.
Vous devrez donc utiliser vos fonction `tfd2()`{.language-python} et `tfdi2()`{.language-python} pour filtrer les images.
Vous devrez donc utiliser vos fonctions`tfd2()`{.language-python} et `tfdi2()`{.language-python} pour filtrer les images.
Histoire de vous familiariser avec le filtrage, créez un signal
simple contenant deux fréquences. Un exemple pourrait être
...
...
@@ -110,33 +119,47 @@ pour $t=[0,1]$. Calculez la transformée de Fourier de ce signal,
puis mettez à zéro le pic correspondant à la plus haute fréquence dans le résultat obtenu.
Faites ensuite la transformée de Fourier inverse, du signal
avec un seul des pics. Voilà, si tout s'est bien passé vous venez de
filtrer les hautes fréquences de votre signal.
filtrer la haute fréquence de votre signal.
Maintenant que vous êtes un professionnel du filtrage, passons à
l'étape supérieure. Chargez une image que vous trouvez sur `cyberlearn`.
Normalement, il s'agit d'images en niveaux de gris encodées sur 16 bits
Maintenant que vous êtes une professionnelle du filtrage, passons
la vitesse supérieure. Chargez l'image que vous trouvez sur `cyberlearn`.
Normalement, il s'agit d'une image en niveaux de gris encodées sur 16 bits
avec que du bruit dessus (on voit pas grand chose...).
Calculez la transformée de Fourier discrète à deux dimensions de ce signal. Inspectez le signal (à l'aide de la fonction `plot_surface()` par exemple). Comme pour le signal uni-dimensionnel, filtrez les hautes fréquences (mettez les amplitudes à zéro) au delà d'une certaine fréquence. En deux dimensions, cela revient à
metter à zéro les $\hat{f}[k_1,k_2]$ $k_1>k_{1,\mathrm{min}}$ ou $k_2>k_{2,\mathrm{min}}$, où $k_{1,\mathrm{min}}$ et $k_{2,\mathrm{min}}$
Calculez la transformée de Fourier discrète à deux dimensions de ce signal. Inspectez le signal (à l'aide de la fonction `plot_surface()` qui se trouve dans `from mpl_toolkits.mplot3d`
par exemple). Comme pour le signal uni-dimensionnel, filtrez les hautes fréquences (mettez les amplitudes à zéro) au delà d'une certaine fréquence[^2]. En deux dimensions, cela revient à
mettre à zéro les $\hat{f}[k_1,k_2]$ $k_1>k_{1,\mathrm{min}}$ ou $k_2>k_{2,\mathrm{min}}$, où $k_{1,\mathrm{min}}$ et $k_{2,\mathrm{min}}$
sont les fréquences à partir desquelles vous voulez filtrer.
Puis, calculez la transformée de Fourier inverse. Si vous avez filtré
correctement votre image, un visage devrait apparaître. Savez-vous de qui il s'agit?
Répétez la procédure jusqu'à ce que vous ayez décrypté toutes les images.
Lorsque vous aurez terminé cette première étape, plus d'images seront déposées sur `cyberlearn` et il faudra
également les filtrer et déterminer les noms des gens s'y trouvant.
## Compression d'image
Sur `cyberlearn` vous trouverez une image nomée `transmetropolitan.pgm`[^3]. Il faudra la lire,
et à l'aide de vos transformées de Fourier la compresser et l'écrire sur le disque.
Vous devrez également fournir l'utilitaire pour la décompresser et l'afficher.
Écrivez un code assez générique pour que l'utilisatrice puisse choisir un degré de compression
allant par exemple de 0 à 9: 0 étant pas compressé et 9 compressé au maximum (quel que soit ce maximum).
# Rendu
Il faut rendre un rapport de quelques pages (quelques: plus petit que 5).
Ce rapport doit être bref et expliquer votre travail. Vous **devez** faire ce travail par groupe de 2 et aucune exception ne sera faite.
Vous devez rendre le rapport et le code que je devrais pouvoir exécuter
pour voir quels sont les visages que vous découvrez.
Déposez le rapport et le code sur le site du cours s'il vous plaît, cela simplifie mon administration (et évite les problèmes avec les étudiants qui ne mettent pas de nom sur le rapport...).
La note est une combinaison de la note du code et du rapport.
La note sera uniquement basée sur votre capacité à trouver les noms des gens sur les photos.
Il faut rendre un rapport de quelques pages (quelques: **plus petit** que 5).
Ce rapport doit être bref et expliquer votre travail.
Je veux un minimum de mathématiques et un maximum d'explications
de haut niveau sur comment fonctionne votre filtrage et votre compression/décompression.
Vous **devez** faire ce travail par groupe de 2 et aucune exception ne sera faite.
Vous devez rendre le rapport et le code sur `cyberlearn` le tout dans une archive aux noms des deux
personnes du groupe. Je devrais pouvoir exécuter
vos codes pour voir quels sont les visages que vous découvrez et comment vous comprimez
vos images. Le rapport sera uniquement évalué sur votre capacité à trouver les noms des gens sur les photos.
# Conseils
# Conseils et remarques
Les librairies `python` que j'ai essayées pour faire moi-même ce TP sont:
...
...
@@ -146,4 +169,6 @@ Les librairies `python` que j'ai essayées pour faire moi-même ce TP sont:
Vous n'êtes pas obligés de les utiliser. Vous pouvez également utiliser n'importe quel autre language pour effectuer ce TP.
[^1]:On représente $f[n]$ et $\hat{f}[k]$ comme des listes (ou vecteurs) de longueur $N$.
\ No newline at end of file
[^1]:On représente $f[n]$ et $\hat{f}[k]$ comme des listes (ou vecteurs) de longueur $N$.
[^2]:Attention le spectre est "à double" donc n'oubliez pas de garder les parties symétriques également.
[^3]:Pour les fans de bande dessinée je vous recommande la lecture de ces comics.