IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Contribution Image : Noyau de convolution Gaussien
Par Florent Humbert

Le , par millie

0PARTAGES

1  0 
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 : Sélectionner tout
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.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de PRomu@ld
Expert éminent https://www.developpez.com
Le 03/07/2007 à 7:22
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).
0  0 
Avatar de kromartien
Membre éprouvé https://www.developpez.com
Le 03/07/2007 à 7:44
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?"
0  0 
Avatar de PRomu@ld
Expert éminent https://www.developpez.com
Le 03/07/2007 à 7:53
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.
0  0 
Avatar de kromartien
Membre éprouvé https://www.developpez.com
Le 03/07/2007 à 8:29
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.
0  0 
Avatar de PRomu@ld
Expert éminent https://www.developpez.com
Le 03/07/2007 à 8:33
Si tu as des questions, ouvre un autre thread.

0  0 
Avatar de paradize3
Membre averti https://www.developpez.com
Le 02/10/2007 à 8:32
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
0  0 
Avatar de millie
Rédacteur https://www.developpez.com
Le 02/10/2007 à 14:32
On peut aussi passer dans l'espace de fourier, c'est encore plus rapide pour les gros noyaux.
0  0 
Avatar de triguim
En attente de confirmation mail https://www.developpez.com
Le 23/07/2009 à 11:44
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
0  0 
Avatar de pseudocode
Rédacteur https://www.developpez.com
Le 23/07/2009 à 12:00
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.
0  0 
Avatar de triguim
En attente de confirmation mail https://www.developpez.com
Le 23/07/2009 à 12:05
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
0  0