# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Application du filtre de Gabor

## DidAus

Bonjour  tous, 

Je suis en train de dvelopper  une petite application qui devrait permettre de dtecter les rides  partir d'images 2D. Pour cela, je dois (d'aprs mes recherches) appliquer  une image un filtre de Gabor.  Je connais dj l'orientation des points et la frquence. 

Voil mon problme : je  n'arrive pas  voir comment appliquer le filtre. Est-ce possible dans le domaine spatial, ou faut-il passer dans le domaine frquentiel ? Quelle est la formule exacte du filtre (j'en ai vu plusieurs diffrentes..) ?

Merci d'avance !

----------


## DidAus

J'ai le code suivant : 



```

```

Les valeurs que j'obtiens en sortie du filtre me semblent trs tranges (entre 0.0001 et 1E-320).

Si quelqu'un peut m'aider, je suis preneur  ::):

----------


## ToTo13

Calcule donc tes masques au pralable et fais les afficher afin de voir qu'ils ont dj bien la bonne forme.
Ensuite, c'est une simple convolution qui peut produire des valeurs ngatives.

----------


## ToTo13

Sinon ceci pourrait t'intresser.

Mieux, il y a eu une thse sur le sujet. Je sais que l'auteur faisait de la dtection/caractrisation de rides pour estimer l'ge des patients.

----------


## DidAus

Salut toto13, merci pour ta rponse. 

Comment calculer mes masques au pralable ? cela n'est pas une perte de temps ? car dans ce cas,  j'ai l'impression qu'on va parcourir l'image encore plus souvent que maintenant.. non ?

Le premier lien que tu as montr, je le connais, je me suis dj bas sur lui... l'autre, je vais y jeter un oeil plus attentif !!

----------


## ToTo13

Non, les calculer pralablement te permettra :
 - de vrifier qu'ils ont la forme souhaite.
 - de ne pas les recalculer pour chaque pixel.
Gnralement lorsque l'on fait une convolution, on passe  la fonction/mthode l'image et le masque  appliquer.

----------


## DidAus

Je ne comprends pas bien... si je les calcule auparavant, je vais les calculer aussi pixel par pixel, et donc je ne vois pas en quoi cela va simplifier la chose ... Car, si j'ai bien compris, le masque sera diffrent pour chaque pixel de l'image, selon la frquence et l'orientation, non ? 

Je ne vois pas bien ce que cela changerai en fait...

----------


## pseudocode

> Je ne comprends pas bien... si je les calcule auparavant, je vais les calculer aussi pixel par pixel, et donc je ne vois pas en quoi cela va simplifier la chose ... Car, si j'ai bien compris, le masque sera diffrent pour chaque pixel de l'image, selon la frquence et l'orientation, non ?


Pour une frquence+orientation donne, on va utiliser le mme masque de convolution sur chaque pixel de l'image. 



```

```


Cela dit, les filtres de Gabor ont tendance a devenir vite assez grand. Passer dans le domaine frquentiel est trs intressant.

----------


## DidAus

Merci pseudocode. Mais chaque pixel de l'image a une orientation et une frquence qui lui sont propres, non ?

----------


## DidAus

je veux dire que du coup, on applique un masque diffrent sur chaque pixel, non ? Je le comprends comme a pour le moment en tout cas..!
Car je trouverais trs bizarre d'appliquer, pour une image aux dimensions LxH, (LxH) filtres... J'ai pas du bien saisir le truc  ::?:

----------


## ToTo13

Dans les filtres de gabor, on a une srie de masques avec des orientations diffrentes.
On applique chaque masque sur TOUS les pixels de l'images.
On garde alors la rponse du masque qui a produit la plus grande valeur.

----------


## pseudocode

> je veux dire que du coup, on applique un masque diffrent sur chaque pixel, non ? Je le comprends comme a pour le moment en tout cas..!
> Car je trouverais trs bizarre d'appliquer, pour une image aux dimensions LxH, (LxH) filtres... J'ai pas du bien saisir le truc


Dans le domaine frquentiel, le filtre fait la taille de l'image et on multiplie donc chaque pixel par la valeur correspondante dans le filtre. On fait donc (LxH) multiplications au total (une par pixel).

Dans le domaine spatial, on effectue une convolution par un masque. Le masque est plus petit que l'image. La convolution consiste a "poser" le masque sur chaque pixel de l'image et calculer la somme des produits pixel/masque. On effectue donc (LxHxSurfaceDuMasque) multiplications.

----------


## DidAus

> Dans les filtres de gabor, on a une srie de masques avec des orientations diffrentes.
> On applique chaque masque sur TOUS les pixels de l'images.
> On garde alors la rponse du masque qui a produit la plus grande valeur.


Du coup, le temps de traitement doit tre trs long, non ? Et comment choisis-t-on les diffrentes orientations pour nos masque, arbitrairement ? Enfin, est-ce qu'on fait la mme chose en ce qui concerne la frquence ?




> Dans le domaine frquentiel, le filtre fait la taille de l'image et on multiplie donc chaque pixel par la valeur correspondante dans le filtre.


D'accord, d'o le gain possible de temps de calcul. Mais n'y a til pas, comme d'aprs le message de ToTo, galement une srie de masques  appliquer en frquentiel ? (et si oui, mmes questions que prcdemment..!) 


Je suis dsol d'avoir beaucoup de questions, mais j'avoue que j'ai vraiment du mal avec ce filtre..!

Merci beaucoup pour vos rponses en tout cas, qui me permettent de ne pas continuer  m'enfoncer dans une voie sans issue..!!

----------


## DidAus

ps : je vous avouerai que si vous pouviez (en plus  ::?:  ) me montrer du code, ou pseudo code, cela pourrait grandement m'aider dans la comprhension du filtre et dans sa ralisation..! Merci beaucoup..!

----------


## pseudocode

> D'accord, d'o le gain possible de temps de calcul. Mais n'y a til pas, comme d'aprs le message de ToTo, galement une srie de masques  appliquer en frquentiel ? (et si oui, mmes questions que prcdemment..!)


Et bien, un filtre de Gabor possde une seule orientation et une seule frquence. 

Si tu veux tester plusieurs orientations ou frquences, il faut un filtre de Gabor  chaque fois. Et donc faire le calcul de multiplication/convolution pour chaque filtre.

Par exemple, sur la page wikipedia, on a utilis 4 filtres de Gabor avec diffrentes orientations (0, 45, 90 et 135)




> ps : je vous avouerai que si vous pouviez (en plus  ) me montrer du code, ou pseudo code, cela pourrait grandement m'aider dans la comprhension du filtre et dans sa ralisation..! Merci beaucoup..!


J'ai post du code Java dans cette discussion (dans le domaine frquentiel).

----------


## ToTo13

> Du coup, le temps de traitement doit tre trs long, non ? Et comment choisis-t-on les diffrentes orientations pour nos masque, arbitrairement ? Enfin, est-ce qu'on fait la mme chose en ce qui concerne la frquence ?


Comme l'a dit PseudoCode, tester les quatre principales c'est dj un bon dbut. Empiriquement, il semble que dpasser 12 orientations ne soit pas ncessaire.
Et oui, c'est long, mais il y a des optimisation possibles dont la principale est le passage en frquentiel (transformes de Fourier FFT), mais je surtout pas oublier de parallliser les calculs.





> Je suis dsol d'avoir beaucoup de questions, mais j'avoue que j'ai vraiment du mal avec ce filtre..!


C'est juste un filtre de convolution classique, mais pour lequel on appliquer plusieurs masque (orientation diffrente) et pour lequel on garde la rponse maximale.

----------


## DidAus

Cela commence  s'claircir, merci !! 

Si j'ai bien compris, on va appliquer le masque plusieurs fois  chaque pixel, avec  chaque fois une orientation diffrente. Pour chaque pixel, on slectionne ensuite la valeur la plus grande qui a t calcule. 

Mais dans ce cas, cela ne sert  rien de calculer l'orientation  chaque point ? et puis, quelle frquence appliquer dans le filtre ? Je trouve cela tonnant, en voyant le lien que tu m'avais montr ToTo ! (http://144.206.159.178/ft/CONF/16425096/16425106.pdf)

----------


## DidAus

En me basant sur ce que vous m'avez dit et l'article que j'ai rementionn dans le post prcdent, j'ai cod ceci (je suis rest dans le domaine spatial pour le moment). les deux premires fonctions permettent de calculer le masque, la troisime sert  comparer les valeurs de chaque et garder la plus grande valeur. Les dclarations au tout dbut sont dans une autre fonction, donc a compile bien ^^ : 



```

```

Voila le rsultat que j'obtiens (en p-j) , pour une image test quelconque (sachant qu' terme, je souhaiterai, si possible, atteindre des rsultats quivalents  ceux de l'article prcdemment mentionn, galement pour les rides) 

image source = fond blanc, image rsultat = fond gris. 

J'ai test avec un ou plusieurs filtres, avec diffrentes orientations, et j'obtiens toujours le mme rsultat... Je dois surement me planter dans le calcul des masques... Si vous voyez quelque chose d'alarmant, hsitez pas..!

Merci !

----------


## ToTo13

> Si j'ai bien compris, on va appliquer le masque plusieurs fois  chaque pixel, avec  chaque fois une orientation diffrente. Pour chaque pixel, on slectionne ensuite la valeur la plus grande qui a t calcule.


C'est a, on l'applique autant de fois qu'il y a d'orientation.





> Mais dans ce cas, cela ne sert  rien de calculer l'orientation  chaque point ?


Si, tu gardes l'orientation du masque qui a produit le meilleur rsultat.






> et puis, quelle frquence appliquer dans le filtre ?


Bonne question, il faut en tester plusieurs.





> Je trouve cela tonnant, en voyant le lien que tu m'avais montr ToTo ! (http://144.206.159.178/ft/CONF/16425096/16425106.pdf)


Qu'est ce qui est tonnant ?

----------


## DidAus

> Qu'est ce qui est tonnant ?


En lisant le papier, je comprenais qu'il fallait calculer pour chaque point son orientation et sa frquence. Et que c'est ceux-ci qui allaient tre utiliss dans le masque de Gabor, et non des valeurs prises 'au pif' en quelques sortes ! 

Il faut alors que je teste des filtres avec orientation et frquences diffrentes... ca fait normment de calculs a encore ^^ 

Merci encore en tout cas ! 

Une ide peut-etre pour l'exemple de code que j'ai montr ?

----------


## ToTo13

Fait donc afficher tes masques, ils n'ont sans doute pas la bonne orientation/forme.

----------


## DidAus

Merci ToTo, je vais faire a... Quelle doit-etre la 'bonne' forme ou orientation d'un tel filtre ?

----------


## ToTo13

Normalement, une forme gaussienne avec des ondulations.

----------


## DidAus

> Bonjour DidAus, 
> j'aimerai te poser une question si possible,  laquelle je n'arrive toujours pas a trouver une rponse : comment on extrait un vecteur caractristique d'une image aprs lui avoir appliqu un banc de filtres Gabor ?? 
> (sachant qu'on traite des matrices, mais la on a un vecteur ??!! )


Bonjour Lyly87, je vais tre clair avec toi, je n'en sais rien... je n'arrive dj pas  l'appliquer, mon fameux filtre !! :/




> Normalement, une forme gaussienne avec des ondulations.


Bonjour ToTo, effectivement, mon filtre n'a pas la forme dsire. Il n'a d'ailleurs rien  voir avec une gaussienne. Sa valeur est constante (~80 pour des orientations de 0 et PI/2, et ~437 pour des orientations de PI/4 et 3PI/4) partout, sauf o l'image teste est noire (la valeur rsultante a la valeur 0)..

Mon code d'implmentation de mon filtre est srement faux, je n'ai pas de doute l-dessus. Mais o peut donc tre l'erreur ? (Je l'ai post quelques posts plus tt) Si vous avez une ide, merci de m'aider ..!

----------


## DidAus

petite rectification (j'ai remarqu une erreur faite lors de l'appel de mes fonctions). 

Voila les masques de Gabor que j'obtiens : 

1- orientation 0;
2- orientation PI/4;
3- orientation PI/2;
4- orientation 3*PI/4;

----------


## ToTo13

Effectivement, on voit bien ici que c'est un problme de masque.
Il faut normalement utiliser une fonction de Gaussienne  deux dimensions qui oscille en dcroissant autour de 0. Donc Gaussienne + fonction trigo (elle mme fonction de la distance au centre) et le tout en rapport avec la distance. Donc a devient horrible :s.
La fonction est dcrite dans la premire page ici.

Mais un bienfaiteur m'a donn a et c'est ce que j'utilise :


```

```

----------


## DidAus

Merci beaucoup ToTo13 ! Les masques sont maintenant de la bonne forme ! Je n'utilisais pas de lambda ni de psi, c'tait surement la cl..! 

Mais j'ai test avec mes 4 orientations diffrentes (0, pi/4, pi/2, 3pi/4), et les masques rsultants ne sont pas tous de la mme taille (13*13 ou 11*11). Y'a-t-il une raison logique  cela ? Et puis,  quoi correspond le paramtre 'nstds' dans ce code ?

----------


## pseudocode

> Mais j'ai test avec mes 4 orientations diffrentes (0, pi/4, pi/2, 3pi/4), et les masques rsultants ne sont pas tous de la mme taille (13*13 ou 11*11). Y'a-t-il une raison logique  cela ? Et puis,  quoi correspond le paramtre 'nstds' dans ce code ?


Le code de Toto13 calcule la taille du masque en fonction de l'orientation de la Gaussienne. C'est pour cela que la taille varie suivant les paramtres. 

"nstds" semble reprsenter le nombre de "standard-deviation" (=sigma) que l'on prend comme support.  

99.7% des valeurs significatives d'une gaussienne sont dans la bande des 3 sigma. Au dela de cette bande, les valeurs sont ngligeables.

----------


## DidAus

Merci beaucoup ToTo et pseudocode, vous tes au top !! Grce  vous, j'ai quelque chose de pas mal dont je vais pouvoir me servir par la suite pour arriver  mon objectif !!  ::D:

----------


## ToTo13

> Merci beaucoup ToTo et pseudocode, vous tes au top !! Grce  vous, j'ai quelque chose de pas mal dont je vais pouvoir me servir par la suite pour arriver  mon objectif !!


 ::chin:: 

 ::ccool:: 

Bonne continuation.

----------


## DidAus

ToTo, je reviens vers toi dans ce sujet car aprs rflexion, quelque chose n'est toujours pas trs clair... Je ne vois pas trs bien  quoi correspondent les variables Psi, lambda, sigmaX et sigmaY ? Et leur influence sur le rsultat du filtre (visuellement?) car l, je suis en train de faire des tests en modifiant ces valeurs une  une, et c'est long, et ch***..  ::): 

Merci

----------


## ToTo13

Les sigmas sont les valeurs utilises pour la gaussienne en X et Y. En gros, longueur et largeur de la gaussienne en 2D.
Lambda est la priode
Psi est la phase.

----------


## DidAus

AAaah okay !! Ca m'est un peu plus clair maintenant, merci beaucoup !

----------


## DidAus

Salut,
jusqu' maintenant j'effectuais un filtre de gabor dans le domaine spatial. j'aimerais en changer, et passer en frquentiel, pour que a aille plus vite (je compte travailler sur des images 1500x1500 environ, donc en spatial c'est trs long. pour le moment je dois redimensionner les images pour avoir un temps de traitement plutot raisonnable). J'ai bien la TF de mon image. 

Dans le domaine spatial, on utilise des noyaux de convolution (13x13 pour ma part), et en frquentiel, on devrait avoir un filtre de la mme taille que l'image. J'ai bien la formule de gabor, mais je vois pas bien comment elle peut amener  un filtre de la taille de l'image :/ (en spatial, je me suis beaucoup inspir du code que tu as post ToTo : 



```

```

Finalement ma question est : comment obtenir un filtre de la mme taille que l'image ? Car appliquer un code semblable  celui-l ne m'apporte rien de bon, j'obtiens toujours des filtres de la mme taille (13x13).

Merci  !

----------


## ToTo13

Dans le domaine frquentiel, il faut que ton filtre/image soit centr dans un tableau dyadique.
Puis tu appliques la transforme de Fourier sur le tableau.
Tu fais la multiplication membre  membre dans l'espace de Fourier.
Tu fais la transforme inverse.

----------


## DidAus

Tout d'abord, merci pour ta rponse ToTo13, et dsol pour le temps de rponse..




> Dans le domaine frquentiel, il faut que ton filtre/image soit centr dans un tableau dyadique.


 ::?:  Un tableau dyadique... je n'ai jamais entendu ce mot ^^ mais il semblerait que ce soit un tableau ou deux lments sont lis entre eux. Donc l'image et le filtre. La question que je me pose est de savoir s'il est possible, et comment, d'avoir ce fameux tableau pour le filtre ? Comme je l'ai mentionn dans mon prcdent post, je suis pour le moment en spatial avec un noyau 13x13. Et je n'arrive toujours pas  obtenir ce fameux filtre de la taille de l'image..





> Puis tu appliques la transforme de Fourier sur le tableau.
> Tu fais la multiplication membre  membre dans l'espace de Fourier.
> Tu fais la transforme inverse.


Ca oui, je suis compltement d'accord, et ca se fait bien  priori !

----------


## ToTo13

Euh en fait en science c'est plutt celle-l.
Bref... une puissance de deux.
Donc tu centres ton image dans un tableau dont la taille est une puissance de 2, puis tu appliques la transforme de Fourier.

----------


## DidAus

Ah ok, j'en tais loin... mais du coup, ici tu entends quoi par 'image', l'image que je veux filtrer? Mais dans ce cas, o est Gabor? 

Ca m'neeeeeeeeeeeerve ce truc  ::(:

----------


## ToTo13

> Ah ok, j'en tais loin... mais du coup, ici tu entends quoi par 'image', l'image que je veux filtrer? Mais dans ce cas, o est Gabor? 
> 
> Ca m'neeeeeeeeeeeerve ce truc


 ::lol:: 

Bon alors :
 - tu centres ton image I dans un tableau T1 de taille dyadique.
 - tu lui appliques la transforme de Fourier sur T1.
 - tu centres ton masque de Gabor dans un tableau T2 de mme taille que T1.
 - tu appliques aussi une transforme de Fourier sur T2.
 - tu fais la multiplication membre  membre de T1 par T2 : T = T1 x T2.
 - tu appliques la transforme de Fourier inverse sur T.
 - tu remets le rsultats dans une image de mme taille que I.

----------


## DidAus

D'accord. pour la TF, TF-1 etc... y'avait pas soucis. Ce que je me demande, c'est que du coup, le masque de Gabor doit tre de la mme taille que l'image, non ? Ou alors, un masque 13x13 pour une image 1500x1500 c'est bon..? 

Merci encore..!!

----------


## ToTo13

Rho... tu ne lis pas ce que je marque  ::aie:: 

*- tu centres ton masque de Gabor dans un tableau T2 de mme taille que T1.
- tu appliques aussi une transforme de Fourier sur T2.*

La transforme de Fourier s'occupe de tout, tu n'as qu' centrer ton masque et appliquer la TF.

----------

