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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[Image] Créer un noyau de convolution gaussien


Sujet :

Contribuez

  1. #1
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    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).

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    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?"

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    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.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut
    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.

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Si tu as des questions, ouvre un autre thread.


  7. #7
    Membre averti

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 352
    Points
    352
    Par défaut
    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

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    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é

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    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

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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.

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    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

  12. #12
    Membre à l'essai
    Profil pro
    conseil scientifique
    Inscrit en
    Septembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conseil scientifique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7
    Points : 13
    Points
    13
    Par défaut
    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)

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 98
    Points : 36
    Points
    36
    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.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 27
    Points
    27
    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.

Discussions similaires

  1. convolution image avec un noyau singulier
    Par S4sha dans le forum Images
    Réponses: 0
    Dernier message: 11/09/2009, 18h05
  2. Créer un noyau de convolution gaussien PREWITT
    Par bilzzbenzbilz dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 20/01/2009, 19h08
  3. Noyau de convolution de flou Gaussien
    Par riadh_ado dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 25/04/2007, 22h11
  4. Filtres et noyau de convolution
    Par nicolas66 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 08/04/2005, 15h54
  5. [Image]Créer une image avec JAVA 1.1
    Par burno dans le forum 2D
    Réponses: 4
    Dernier message: 11/08/2004, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo