Traitement d'image sous octave - fft2 & ifft2

Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 21 juin 2012 à 19:16
mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 - 26 juin 2012 à 00:45
'lut,

je me suis mis à bidouiller des images avec Octave (équivalent Matlab)
et ai essayé de chercher à comprendre ce que pouvait bien vouloir dire
"transformée de Fourier" dans le domaine de l'image. Bref j'ai rien compris,
mais je m'amuse à faire des trucs...
Mais là je n'arrive pas à en faire un en particulier :

j'ai extrait d'une image, son module et sa phase dans "l'espace de Fourier" (je ne sais pas si on peut appeler ça comme ça).
Puis, j'ai exporté ces deux images.

J'aimerai, en les réimportant, pouvoir recomposer mon image originale mais j'ai un problème qui s'offre à moi là :

j'ai pris le log du module de la TF pour y voir qqch (sinon j'ai un seul pixel blanc au milieu d'une image entièrement noire). Mes valeurs sont donc "petites", comprise entre 0.5 et 7 environ.
Pour la phase, les valeurs étaient logiquement comprises entre -pi et +pi.

Or lorsqu'on importe une image, le noir est représenté par le chiffre 255 et le blanc c'est 0.

Est-ce qu'il y a eu perte d'information à ce niveau (lors de l'import) ?
Ou est-ce que je peux quand même recomposer mon image de base par transformée inverse ?

Je me suis mis à retrouver les composantes cartésiennes de la "matrice de Fourier" à partir du module et de la phase, en changeant celle-ci pour qu'elle soit à nouveau comprise entre -pi et pi, par contre je n'obtiens pas du tout mon image originale en appliquant une inverse là dessus, mais une image très bruitée sans aucune information...

Des tuyaux sont donc les bienvenus !
Merci.

euh...
ps : je n'y connais strictement rien à tout ce qui touche au traitement de l'image ou du signal, j'apprends gentiment dans mon coin, alors dites si c'est pas clair ce que j'ai raconté là.
A voir également:

5 réponses

mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
22 juin 2012 à 20:21
En fait il faudrait surtout que tu vois comment on réutilise les coefficients de ta série de Fourier pour reconstruire l'image.

Petits rappels :

Le principe d'une série de Fourier consiste à transformer un signal en une somme de sinus/cosinus et d'un signal constant de périodes 2k.pi.x/T. Du coup il suffit de stocker ces coefficients pour obtenir un signal approché. Plus k couvre un spectre important, plus ta gamme de fréquence est riche et plus tu peux espérer obtenir un signal approché fidèle au signal de départ.
https://fr.wikipedia.org/wiki/S%C3%A9rie_de_Fourier

C'est sur ce principe que fonctionne bon nombre de compression en informatique (mp3, jpg etc...), le taux d'échantillonnage permettant en gros de définir ta gamme de fréquence. Maintenant si on prend l'exemple d'une image jpg, ce taux d'échantillonnage n'est pas nécessairement constant (inutile d'accumuler moult coefficients dans des "zones" d'image uniforme, comme par exemple un ciel bleu).
https://fr.wikipedia.org/wiki/JPG

Retournons à ton problème :

Je ne sais pas ce qu'Octave calcule mais je suppose que ce sont ces fameux coefficients. En soit il n'ont donc pas de rapport pour moi avec la matrice associé à la couleur des pixels de l'image. En gros l'idée c'est que si tu as une image originale M qui contient une valeur associée à chaque couleur de pixel (en gros ce que stocke un fichier bmp), tu vas obtenir une série de coefficients C

M ---> C

À partir de ces coefficients tu peux reconstituer une matrice (je suppose) M' qui est une approximation de la matrice de départ M :

C ---> M'

Je ne sais pas comment marche ta fonction octave et donc ce qui suit n'a peut être aucun sens ou aucun rapport avec ce qui se passe dans ton cas. Le but est juste de montrer que ce que tu obtiens après transformation n'est sans doute pas directement réutilisable et aussi te faire sentir que tu ne nous a pas donné assez d'information pour qu'on soit sûrs du problèmes :
- Supposons qu'elle mette sur une colonne la matrice M.
- On obtient alors un vecteur Y tel que chaque ligne peut être vue comme une "abscisse" dans un signal (en d'autre terme, tu définis une série de points).
- À partir de cette série de points tu peux chercher une série de Fourier qui traverse tous ces points caractérisée par ses coefficients C.
- Calculer f(1) te donnera la valeur de Y'(1) qui est une approximation de Y(1), etc...
- À partir du vecteur Y' on peut alors reconstruire M'.
Du coup tu t'aperçois que les coefficients C permettent de recalculer Y' (cf formule de la série de Fourier) mais ne sont pas directement les valeurs de ce vecteur.

Bref il faudrait voir si ta fonction octave fait bien ça (as-tu un lien vers la doc d'octave qui explique ce qu'elle fait) ?

Bonne chance
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
22 juin 2012 à 23:04
Salut et merci pour tes explications,

octave c'est l'équivalent libre de Matlab, c'est un programme de calcul matriciel.

La fonction que j'utilise pour passer de mon image de base à mon image "transformée de fourier" :
Loadable Function: fft2 (a, n, m)
Compute the two-dimensional FFT of a. The optional arguments n and m may be used specify the number of rows and columns of a to use. If either of these is larger than the size of a, a is resized and padded with zeros.

If a is a multi-dimensional matrix, each two-dimensional sub-matrix of a is treated separately

Mon image de base est une matrice où chaque élément représente la "couleur", on va faire simple, prenons une image en niveaux de gris, et bien chaque pixel est représenté par un chiffre entre 0 (noir) et 255(blanc) qui quantifie son niveau de gris.


La fonction fft2 me retourne donc une matrice de nombres complexes, pas vraiment exploitable comme ça.

Mais si je prends, pour chaque pixel, la valeur de l'angle et du module du nombre complexe, je peux dès lors recréer deux matrices :
- celle du module
- celle de l'angle (ou de la phase comme je l'ai appelée plus haut).

Je pose un exemple tout bête ici avec une petite matrice carrée représentant une image de départ de neuf pixels :
A =
1 128 255
0 255 60
255 220 80

image que l'on peut voir ici : http://www.noelshack.com/2012-25-1340398584-test.png

En lui appliquant la transformée de fourier on obtient une matrice Af :
Af = fft2(A)
Qui vaut :
Af =
1254.000 + 0.000i -243.000 - 180.133i -243.000 + 180.133i
-51.000 + 207.846i -205.500 + 482.376i -123.000 - 27.713i
-51.000 - 207.846i -123.000 + 27.713i -205.500 - 482.376i

on lui applique un "shift" pour que les valeurs des basses fréquences situées dans les coins, se retrouvent au centre :

Af = fftshift(Af);
Af =
-205.500 - 482.376i -51.000 - 207.846i -123.000 + 27.713i
-243.000 + 180.133i 1254.000 + 0.000i -243.000 - 180.133i
-123.000 - 27.713i -51.000 + 207.846i -205.500 + 482.376i

Avec son module :
524.33 214.01 126.08
302.48 1254.00 302.48
126.08 214.01 524.33

Et sa phase :
-1.97353 -1.81142 2.91999
2.50369 0.00000 -2.50369
-2.91999 1.81142 1.97353

qui peuvent être représentée par des images elles aussi :

- module (je prends le log pour plus de commodité) :
http://www.noelshack.com/2012-25-1340398851-test2.png
- phase :
http://www.noelshack.com/2012-25-1340398899-test3.png

Et c'est là que viennent les problèmes :
en enregistrant ces deux images, et les réimportant ensuite, les pixels sont lus comme étant des valeurs entre 0 et 255. Or ce ne sont pas les valeurs originales de ces deux matrices comme on le voit bien ci-dessus.

Et même en appliquant les bonnes transformations (mais je vais re-tester quand même) et en essayant de recomposer la matrice des complexes, je n'arrive pas à retrouver mon image d'origine.
Tandis qu'en appliquant la fonction inverse, ifft2, à la matrice des complexes ci-dessus, je retombe bien sur mes pattes et retrouve mon image de départ.


0
mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
23 juin 2012 à 12:19
fft2 (a, n, m)

Je suppose que tu invoques fft2(a) (ie fft2(a, num_rows(a), num_colums(a)) ?

La fonction fft2 me retourne donc une matrice de nombres complexes, pas vraiment exploitable comme ça.

Appelons la matrice complexe calculée par fft2 F. Je suppose qu'octave (ou un cours de théorie du signal) explique comment calculer A' à partir de F, ou A' est une approximation de ta matrice de départ A ?

Tandis qu'en appliquant la fonction inverse, ifft2, à la matrice des complexes ci-dessus, je retombe bien sur mes pattes et retrouve mon image de départ.

ifft2 est la fonction inverse de fft2 ?
Si oui je ne comprends pas ce que tu cherches à faire, tu veux recoder ifft2 ?
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
25 juin 2012 à 22:26
Salut,

j'invoque fft2 (A) tout simplement, ce qui me donne une matrice complexe.

de là j'en tire une matrice pour la phase et une pour le module.

Je ne cherche pas à recoder ce qui existe mais à pouvoir recomposer l'image A à partir de deux images : une pour la phase, et une pour le module en utilisant la fonction inverse ifft2.

Si ces deux matrices de phase et de module sont en mémoire, ça marche.
Si elles sont chargées à partir d'images externe, ça ne marche pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
26 juin 2012 à 00:45
j'invoque fft2 (A) tout simplement, ce qui me donne une matrice complexe.

En admettant que fft/ifft et fft2/ifft2 se comportent de la même façon il ne suffit pas de faire ceci ?
https://fr.wikibooks.org/wiki/Programmation_Octave/Traitement_du_son

Si ces deux matrices de phase et de module sont en mémoire, ça marche.
Si elles sont chargées à partir d'images externes, ça ne marche pas.


Je ne comprends pas trop ce que tu veux dire. Quand tu parles d'une image externe, tu veux dire que tu extrais la matrice A correspondante, que tu calcules une matrice de phase et une matrice de module, et que tu reconstruis ton image à partir de là ?

Quelles informations charges-tu à partir de tes fichiers externes ?

Ensuite ce que je ne comprends pas c'est que ifft2 attend une matrice complexe (en admettant qu'elle fonctionne comme fft2), du coup si tu pars d'une matrice contenant les modules et une autre les phases, il faut d'abord reconstituer la matrice complexe qui en découle... non ?
0