Traitement d'image sous octave - fft2 & ifft2
'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à.
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:
- Traitement d'image sous octave - fft2 & ifft2
- Gnu octave - Télécharger - Édition & Programmation
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
- Image iso - Guide
- Traitement de texte gratuit - Guide
- Ce traitement de texte gratuit et léger est parfait pour remplacer Word, même sur un vieux PC - Guide
5 réponses
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
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.
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 ?
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
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 ?