Flouter une image a l'aide de FFT (Cooley-Tukey-Gauss)

biloy Messages postés 23 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 7 avril 2010 - 27 oct. 2009 à 16:27
biloy Messages postés 23 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 7 avril 2010 - 31 oct. 2009 à 11:50
Bonjour,
Avec un collègue, nous voudrions créer un programme pour flouter une image. On sait qu'il faut utiliser les transformations de Fourrier (selon Cooley-Tukey). Mais voilà, tout ça est un peu flou , et je voudrais savoir si on est sur la bon piste. On a télécharger le code ( http://en.literateprograms.org/Special:Downloadcode/Cooley-Tukey_FFT_algorithm_(C) ). A partir de ça, pourra-t-on arriver a flouter une image?

Merci d'avance.

9 réponses

Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
27 oct. 2009 à 16:59
Salut
Flouter une image n'est vraiment pas compliqué et utiliser une fft pour faire ca c'est un peu l'usine à gaz.
Il suffit de faire une convolution avec un masque gaussien ou autre (Voir ici

Si vous voulez vraiment utiliser une fft, il faut effectivement utilisé une transition douce, gaussien ou tukey à la fréquence de coupure. Pour flouter l'image, il faut conserver le centre de l'image...
A+


____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
biloy Messages postés 23 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 7 avril 2010
27 oct. 2009 à 17:17
En fait on doit trouver le code de la TFD sur le net et l'implémenter dans notre code source pour obtenir une image flou. On arrive a changer les couleurs de chaque pixel pour modifier l'image. Mais là on coince, on voit pas comment utiliser la fonction qu'on a trouvé, sachant qu'elle prend comme argument un complexe et on sait pas d'où il viendrait. De plus, je ne vois pas ce que N représente. Je suis sûr c'est tout con et que c'est sous notre nez...

Et la j'ai mal au crâne, depuis 13h qu'on est dessus.

Merci d'avance.

complex* FFT_simple(complex* x, int N /* must be a power of 2 */) {
complex* X = (complex*) malloc(sizeof(struct complex_t) * N);
complex * d, * e, * D, * E;
int k;

if (N == 1) {
X[0] = x[0];
return X;
}

e = (complex*) malloc(sizeof(struct complex_t) * N/2);
d = (complex*) malloc(sizeof(struct complex_t) * N/2);
for(k = 0; k < N/2; k++) {
e[k] = x[2*k];
d[k] = x[2*k + 1];
}

E = FFT_simple(e, N/2);
D = FFT_simple(d, N/2);

free(e);
free(d);

for(k = 0; k < N/2; k++) {
/* Multiply entries of D by the twiddle factors e^(-2*pi*i/N * k) D[k] = complex_mult(complex_from_polar(1, -2.0*PI*k/N), D[k]);
}

for(k = 0; k < N/2; k++) {
X[k] = complex_add(E[k], D[k]);
X[k + N/2] = complex_sub(E[k], D[k]);
}

free(D);
free(E)
return X;
}
0
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
27 oct. 2009 à 17:24
N correspond au nombre de donnée que tu lui donnes.
Les données d'entrées sont des complexes: bien sur la fft travaille avec des complexe! T'as juste à mettre la partie réel à tes données et la partie imaginaire à 0.

Attention, il faut faire une fft 2D pour les images...

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
biloy Messages postés 23 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 7 avril 2010
29 oct. 2009 à 16:12
Tu veux dire quoi par fft 2D? faire un tableau?
0

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

Posez votre question
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
29 oct. 2009 à 17:11
Oui ca revient à créer un tableau 2D.
On applique une fft d'abord sur les lignes de ton images puis ensuite sur les colonnes.
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
reva91 Messages postés 1 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 29 octobre 2009
29 oct. 2009 à 19:08
merci biloy tu m'aura bien aidé en posant cette question là^^
0
biloy Messages postés 23 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 7 avril 2010
30 oct. 2009 à 01:05
AAH je galère.

Pour modifier l'intensité d'une couleur d'un pixel, le principe veut qu'on fasse la moyenne par convolution, de l'intensité de la couleur des 8 pixel qui entoure le voulu. C'est bien ça le principe? On fait la même chose avec la FFT? Je dois donc faire un tableau en 2D pour chaque couleur?

Je vois pas trop comment utiliser le complexe que me retourne la FFT, ni même celui qu'il faut entrer.

Merci d'avance pour un petit éclairage.
0
Pistol_Pete Messages postés 1054 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
30 oct. 2009 à 20:11
Oui, la convolution revient à faire cela. Il y a bcp de filtres qui sont basé sur ce principe.
Faire un filtrage passe bas par fft, il faut que tu conserves le centre de l'image dans le domaine fréquentielle. (Mettre à 0, l'extérieur de l'image). Il suffit alors de faire une fft inverse.
Il y a pas mal d'autres subtilités mais avec ca vous devriez avoir de premier résultats.
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
biloy Messages postés 23 Date d'inscription lundi 15 décembre 2008 Statut Membre Dernière intervention 7 avril 2010
31 oct. 2009 à 11:50
Merci. J'avais lu aussi qu'il fallait faire une fft inverse.
Normalement ça devrait marcher mais j'ai un problème avec des variables, et a la fin, j'obtiens un carré noir. Mais je sais d'où ça provient ça va aller vite.
0
Rejoignez-nous