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
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
A voir également:
- Traitement d'image sous octave - fft2 & ifft2
- Image iso - Guide
- Acronis true image - Télécharger - Sauvegarde
- Octave download - Télécharger - Édition & Programmation
- Faststone image viewer - Télécharger - Visionnage & Diaporama
- Image iso windows 10 - Guide
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
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
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
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
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.
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.
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
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 ?
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 ?
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
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.
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.
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
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 ?
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 ?