Précédent   Forum du club des développeurs et IT Pro > Autres langages > Algorithmes > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 25/04/2007, 19h05   #1
millie
Rédacteur/Modérateur
 
Avatar de millie
 
Inscription : juin 2006
Messages : 6 935
Détails du profil
Informations personnelles :
Localisation : Luxembourg

Informations forums :
Inscription : juin 2006
Messages : 6 935
Points : 9 062
Points : 9 062
Par défaut [Image] Créer un noyau de convolution gaussien

L'algorithme créait un noyau de convolution d'un certain rayon et d'un sigma défini.

Si le rayon vaut 1 par exemple, alors le noyau sera de taille 2*rayon+1 en largeur et 2*rayon +1 en hauteur.
Pour accèder à un élément du noyau, on note : kernel(i,j) ou (i,j) désigne la position (commence à 0 et pas à 1)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fonction creerNoyauGaussien(Entier rayon, Reel sigma) -> Noyau

kernel : Noyau de convolution de taille 
  largeur = 2*rayon+1
  hauteur = 2*rayon+1
  et centré en (rayon, rayon)

Si sigma == 0
 Erreur
Si rayon<1
  Erreur

Réel gaussianKernelFactor <- 0
Réel e <- 0

Pour ky = -rayon à rayon
 Pour kx = -rayon à rayon
 {
   e <-  exp( - (kx*kx+ky*ky) / (2*sigma*sigma))
   gaussianKernelFactor <- gaussianKernelFactor  + e
   kernel(kx+rayon, ky+rayon) <- e  
 }

  /*on divise tout par le facteur afin que la somme de tous les éléments
   * soient égaux à 1
   */

Pour ky = -rayon à rayon
 Pour kx = -rayon à rayon
 {
     kernel(kx+rayon, ky+rayon) <-  kernel(kx+rayon, ky+rayon) / gaussianKernelFactor
 }

retourner kernel
Rayon 3 : sigma 2


Rayon 3 : sigma 5

Rayon 5 : sigma 5


A noter que le temps d'attente devient infernal au dessus d'yn rayon 5 (matrice de convolution de taille 11*11), il vaut mieux passer dans l'espace de Fourier.
__________________
Je ne répondrai à aucune question technique en privé
millie est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/07/2007, 07h22   #2
PRomu@ld
Responsable Algorithmes
 
Avatar de PRomu@ld
 
Homme Romuald Perrot
Attaché Temporaire d'Enseignement et de Recherche (ATER)
Inscription : avril 2005
Messages : 4 146
Détails du profil
Informations personnelles :
Nom : Homme Romuald Perrot
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Attaché Temporaire d'Enseignement et de Recherche (ATER)
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 4 146
Points : 6 166
Points : 6 166
En général, utilisé tels quels, ils ne sont pas très utiles tant ils lissent les contours. Utilisés de manière adaptative, ils servent de prétraitement avant par exemple une segmentation.

Tu peux t'en servir aussi dans un domaine plus artistique, pour effectuer un effet de "glow" autour des objets (en combinant ça avec des masques).
__________________
http://rperrot.developpez.com
http://phos-graphein.fr

Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter.
PRomu@ld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 07h44   #3
kromartien
Membre émérite
 
Inscription : juin 2006
Messages : 1 117
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : juin 2006
Messages : 1 117
Points : 900
Points : 900
en fait alors une bonne utilisation serait de traiter algorithmiquement une image avec un kernel adaptatif, c'est à dire que le programmeur aura stocké des kernels spécifiques qui seront utilisés en fonction des caractéristiques de la zone de l'image à traiter.
Ça se fait? Ok merci la bonne idée.

[edit] J'ai supprimé mon post précédent que je retranscris ici, à replacer entre le post de millie et celui de Promu@ld :

"Le filtrage est-il le seul intérêt des kernels de convolution, ou ont-ils des applications plus spécifiques?"
kromartien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 07h53   #4
PRomu@ld
Responsable Algorithmes
 
Avatar de PRomu@ld
 
Homme Romuald Perrot
Attaché Temporaire d'Enseignement et de Recherche (ATER)
Inscription : avril 2005
Messages : 4 146
Détails du profil
Informations personnelles :
Nom : Homme Romuald Perrot
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Attaché Temporaire d'Enseignement et de Recherche (ATER)
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 4 146
Points : 6 166
Points : 6 166
En fait par adaptatif, je parle de l'application du filtre, en fait grosso modo, lorsque tu as un contour (où une différence très importante entre deux zones ce qui revient parfois au même ), tu n'appliques pas le filtre, ça permet de préserver le contour tout en réduisant le bruit dans les zones uniformes.
__________________
http://rperrot.developpez.com
http://phos-graphein.fr

Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter.
PRomu@ld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 08h29   #5
kromartien
Membre émérite
 
Inscription : juin 2006
Messages : 1 117
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : juin 2006
Messages : 1 117
Points : 900
Points : 900
oui c'est ça, mais je ne sais pas encore de quelle manière on peut caractériser une zone. Je pensais à une moyenne sur un carré de quatre pixels par exemple, méthode 'artisanale', mais je n'ai pas d'autre idée pour définir un seuil pour l'utilisation de tel ou tel kernel de convolution. S'il faut coupler ça avec de la détection de contours, ça devient assez difficile. Je suis en train de lire quelques cours à ce sujet, mais je suis bien loin d'une implémentation.
kromartien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 08h33   #6
PRomu@ld
Responsable Algorithmes
 
Avatar de PRomu@ld
 
Homme Romuald Perrot
Attaché Temporaire d'Enseignement et de Recherche (ATER)
Inscription : avril 2005
Messages : 4 146
Détails du profil
Informations personnelles :
Nom : Homme Romuald Perrot
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Attaché Temporaire d'Enseignement et de Recherche (ATER)
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 4 146
Points : 6 166
Points : 6 166
Si tu as des questions, ouvre un autre thread.

__________________
http://rperrot.developpez.com
http://phos-graphein.fr

Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter.
PRomu@ld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2007, 08h32   #7
paradize3
Membre confirmé
 
Inscription : août 2007
Messages : 302
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 302
Points : 287
Points : 287
Millie,

Juste une petite remarque, le filtre gaussien est separable, donc il suffirait de calculer un noyau 1d, puis l'appliquer dans les deux directions. Tu obtiendras surement de bien meilleurs resultats en terme de performance.

En guise d'exemple d'application, les filtres gaussien sont tres utiliser dans les algorithm de detection de feature points invariant a l'agrandissement (cf D. Lowe, SIFT par exemple).

Salutations,

Gregoire
paradize3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2007, 14h32   #8
millie
Rédacteur/Modérateur
 
Avatar de millie
 
Inscription : juin 2006
Messages : 6 935
Détails du profil
Informations personnelles :
Localisation : Luxembourg

Informations forums :
Inscription : juin 2006
Messages : 6 935
Points : 9 062
Points : 9 062
On peut aussi passer dans l'espace de fourier, c'est encore plus rapide pour les gros noyaux.
__________________
Je ne répondrai à aucune question technique en privé
millie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2009, 11h44   #9
triguim
En attente de confirmation mail
 
Inscription : mai 2009
Messages : 2
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 2
Points : 2
Points : 2
Par défaut je suis débutant

Citation:
Envoyé par millie Voir le message
On peut aussi passer dans l'espace de fourier, c'est encore plus rapide pour les gros noyaux.
Bonjour,
je veux savoir la relation entre sigma et le rayon.
Le but de mon travail est d'appliquer un flou gaussien sur une image nette.
Donc, la construction du masque est l'étape la plus importante.Ce masque servira pour la convolution.
Il est évident que la taille de ce masque depend de sigma, il est grande lorsque sigma est grand et il est petite lotsque sigma est petit.
ma question: est ce qu'il ya une relation entre sigma et la taille du masque?
En effet, moi je veux construire le masque de convolution et j'ai que la valeur de sigma comme donnée.
Merci d'avance
triguim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2009, 12h00   #10
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 473
Points : 16 473
Citation:
Envoyé par triguim Voir le message
ma question: est ce qu'il ya une relation entre sigma et la taille du masque?
En effet, moi je veux construire le masque de convolution et j'ai que la valeur de sigma comme donnée.
Merci d'avance
En théorie, il faudrait un rayon infini car la courbe gaussienne ne devient jamais nulle. La courbe gaussienne possède cependant des propriétés intéressantes : la plupart des valeurs "fortes" sont autour de zéro (le centre du masque)



68% des valeurs se trouvent dans un rayon "sigma" autour du centre
95% des valeurs se trouvent dans un rayon "2*sigma" autour du centre
99% des valeurs se trouvent dans un rayon "3*sigma" autour du centre

Donc en prenant un rayon de 2*sigma ou 3*sigma, on a un "bon" noyau gaussien.

C'est à dire un masque de taille (2*rayon) entre 4*sigma et 6*sigma.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2009, 12h05   #11
triguim
En attente de confirmation mail
 
Inscription : mai 2009
Messages : 2
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 2
Points : 2
Points : 2
Citation:
Envoyé par triguim Voir le message
Bonjour,
je veux savoir la relation entre sigma et le rayon.
Le but de mon travail est d'appliquer un flou gaussien sur une image nette.
Donc, la construction du masque est l'étape la plus importante.Ce masque servira pour la convolution.
Il est évident que la taille de ce masque depend de sigma, il est grande lorsque sigma est grand et il est petite lotsque sigma est petit.
ma question: est ce qu'il ya une relation entre sigma et la taille du masque?
En effet, moi je veux construire le masque de convolution et j'ai que la valeur de sigma comme donnée.
Merci d'avance
j'ai trouvé la réponse il faut que
taille = 5* sigma
triguim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2009, 09h29   #12
ELw.py
Invité régulier
 
Inscription : septembre 2006
Messages : 5
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 5
Points : 5
Points : 5
Citation:
Envoyé par pseudocode Voir le message
\[...\]
95% des valeurs se trouvent dans un rayon "2*sigma" autour du centre
Juste un détail en complément : cette équivalence "95% <-> 2sigma" NE vaut QUE pour la gaussienne 1D. En 2D (respectivement nD), il faut un peu (resp. de plus en plus) agrandir le rayon.

Pour s'en convaincre, facile en 2D : dans le plan (x,y), la bande verticale de largeur 4 sigmas "pèse" 95% (loi marginale) ; comme elle contient l'ellipse à 2 sigmas, plus des "ailes" (*), même si ces ailes ne pèsent pas lourd, c'est autant à enlever aux 95% qu'on voudrait dans l'ellipse. Du coup, pour compenser, il faut augmenter un peu la taille de l'ellipse. Et comme en nD, avec ce même raisonnement, les ailes occupent de plus en plus de place, il y a fort à parier que leur poids augmente d'autant... Un peu calcul avec les pieds, à vérifier pour la divergence en nD, mais l'idée est là.
(*) un chapeau mexicain découpé par l'avant et l'arrière en une bande, ça lui donne un peu, vu de loin, une allure de chef de juge médiéval chinois comme celui du juge Ti, non ? :-)

Maintenant, je viens d'essayer de trouver une page web qui donne le calcul exact de la masse de proba à l'intérieur de l'ellipsoïde à k sigmas en nD, avec ou sans corrélations : bernique et queues d'chi ! Si quelqu'un connaît ça ?... (pitêt, je devrais aller voir du côté d'un forum de stateux ? Conseils bienvenus :-) -- merci)
ELw.py est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2010, 12h32   #13
AYDIWALID
Invité régulier
 
Inscription : décembre 2008
Messages : 98
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 98
Points : 6
Points : 6
Par défaut relation entre sigma et taille masque

bonsoir,

s'il vous plait peut on m'expliquer comment peut on determiner la relation entre la taille du masque et la valeur de sigma d'un filtre gaussien.
j'ai trouvé que la taille=6*sigma sans explications

s'il vous peut on m'expliquer d'ou vient cette formule.

Merci d'avance.

Citation:
Envoyé par pseudocode Voir le message
En théorie, il faudrait un rayon infini car la courbe gaussienne ne devient jamais nulle. La courbe gaussienne possède cependant des propriétés intéressantes : la plupart des valeurs "fortes" sont autour de zéro (le centre du masque)



68% des valeurs se trouvent dans un rayon "sigma" autour du centre
95% des valeurs se trouvent dans un rayon "2*sigma" autour du centre
99% des valeurs se trouvent dans un rayon "3*sigma" autour du centre

Donc en prenant un rayon de 2*sigma ou 3*sigma, on a un "bon" noyau gaussien.

C'est à dire un masque de taille (2*rayon) entre 4*sigma et 6*sigma.
AYDIWALID est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 00h47   #14
mathwork
Invité régulier
 
Inscription : juillet 2011
Messages : 11
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 11
Points : 7
Points : 7
Par défaut probléme du lissage gaussien et solution

slt..certes,utiliser un filtre gaussien, revient à éliminer le bruit,mais il ne faut pas oublier que c'est un filtre linéaire:il diffuse de la méme maniere sur toute l'image.une solution pour palier à ce probléme serait de le combiner avec un filtre non linéaire, comme le filtre AOS, qui diffuse de façon uniforme,de cette façon on peut controlér le lissage du filtrage, en imposant un lissage faible au niveau des contours (ou régions d’intérêt ) et un autre important ailleurs.
mathwork est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h40.


 
 
 
 
Partenaires

Hébergement Web