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

Traitement d'images Discussion :

Noyau de convolution de flou Gaussien


Sujet :

Traitement d'images

  1. #1
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Noyau de convolution de flou Gaussien
    Slt les amis j'ai quelques questions que je ne comprend pas et je serais content de m'avoir aidé a les résolu.
    Comment a partir de la formule de gausse on obtient le masque? Est-ce qu’il y a une formule mathématique qu’a partir "s=sigma" on détermine le maque de convolution ?Merci.

  2. #2
    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
    gaussian kernel:

    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
    
        |        |        |        |
    
        |        |        |        |
    - - ---------------------------- - -
        |        |        |        |
        |G(-1,-1)|G(0,-1) |G(+1,-1)|
        |        |        |        |
    - - ---------------------------- - -
        |        |        |        |
        |G(-1,0) | G(0,0) |G(+1,0) |
        |        |        |        |
    - - ---------------------------- - -
        |        |        |        |
        |G(-1,+1)|G(0,+1) |G(+1,+1)|
        |        |        |        |
    - - ---------------------------- - -
        |        |        |        |
    
        |        |        |        |
    
    avec G(x,y) = Exp[ - (x^2+y^2)/(2*sigma^2) ]
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    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
    Voilà le code que j'utilisais pour en définir un d'un certain rayon (à noter que la somme de tous les coéfficients valent un ici pour éviter que ça paraisse sombre) :
    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
    KernelGaussian::KernelGaussian(int rayon, double sigma)
        : Kernel(2*rayon+1,2*rayon+1,rayon,rayon)
    {
      if(sigma <0.0f)
        throw IllegalArgument("KernelGaussian : sigma negative");
     
      float gaussianKernelFactor=0;
     
      for(int ky=-rayon;ky<=rayon;ky++)
      {
        for(int kx=-rayon;kx<=rayon;kx++)
        {
          float e = exp( - (kx*kx+ky*ky) / (2*sigma*sigma) );
          gaussianKernelFactor += e;
          setValue(kx+rayon, ky+rayon, e);
        }
      }
     
      for(int ky = 0; ky< getHeight(); ky++)
       for(int kx = 0; kx < getWidth(); kx++) {
          float valeur = (*this)(kx,ky);
          setValue(kx, ky, valeur/ gaussianKernelFactor);
       }
     
    }
    A noter que si la matrice devient grosse, il est préferable de passer dans l'espace de Fourier.

    La définition du masque dans l'espace de Fourier se fait alors de cette manière (on centre en largeur/2, hauteur/2) :

    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
    CMaskFactoryGaussianBlur::CMaskFactoryGaussianBlur(float sigma)
    {
     _sigma = sigma;
     
    }
     
    void CMaskFactoryGaussianBlur::computeWithoutChecking(ImageComplex & out, int largeur, int hauteur) const
    {
      if(largeur<0 || hauteur<0)
        throw IllegalArgument("CMaskFactoryHighPass::compute");
     
     
      out.resize(largeur, hauteur);
     
     
      for(int canal=0; canal< out.getNumComponents(); canal++)
      {
        for(int j=0; j<hauteur;j++)
          for(int i=0; i<largeur;i++)
          {
            std::complex<float> comp(
              exp(- carre(_sigma) * (carre(i-largeur/2.0) + carre(j-hauteur/2.0))/(2.0))
              ,0.0f);
     
              out.setPixel(i,j, canal, comp);
          }
     
      }
     
    }
    Bon, ce n'est pas un code algorithmique, mais j'ai la flemme de la traduire.
    Je ne répondrai à aucune question technique en privé

  4. #4
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut explication
    je pense que je ne suis pas precis dans ma question; Ma probleme consiste a determiné un masque selon la valeur sigma, cad un exemple
    l'opérateur de convolution : est


    est le masque 5x5 de s=1.4 est



    comment on peut determiné ce masque, merci pour votre aide

  5. #5
    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
    Je t'ai fourni l'algorithmique pour déterminer un masque gaussien de taille quelconque (donc 5*5 si tu veux, c'est à dire de rayon 2) avec sigma quelconque. Regarde la première source que je t'ai donné.
    Je ne répondrai à aucune question technique en privé

  6. #6
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut fonction SetValue
    a quoi sert la fonction SetValue, je ne le comprend pas merci encore pour ton aide, vraiment merci

  7. #7
    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
    Ca met la valeur au noyau à la position indiquée (ça commence à 0 la notation)
    Je ne répondrai à aucune question technique en privé

  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
    Voilà écrit sous forme d'algorithme :

    http://www.developpez.net/forums/sho....php?p=2001019
    Je ne répondrai à aucune question technique en privé

  9. #9
    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 millie
    Voilà écrit sous forme d'algorithme :

    http://www.developpez.net/forums/sho....php?p=2001019
    ca se remplit rudement vite la rubrique contribution en ce moment
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    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
    Déjà de ton côté tu ajoutes plein de trucs

    Et du miens, vu que je suis en train de faire une bibliothèque de traitement d'images, j'ajoutes au fur et à mesure plein de chose "de base" et donc, j'en profite pour les poster si il y en a qui demande.

    Même si ce sont des choses de base, parfois, quand on les a pas implémenté on a du mal à savoir comment faire (genre l'érosion pour des images en niveau de gris (et pas binaire), j'ai eu du mal à trouver).
    Pareil pour le seuillage binaire pour les images en couleurs, on voit souvent dans les logiciels (gimp photoshop) que ça fait un vrai seuillage binaire noir/blanc. J'ai mis beaucoup de temps à comprendre qu'il prenait la "lumière" (HSL) pour faire le seuillage sur les images RGB (je pensais avant que c'était la somme des composantes sur 3, où le max...)
    Je ne répondrai à aucune question technique en privé

  11. #11
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut gaussienne
    Avant tout, merci pour ton aide, mais je sent dans l'algorithme que tu as negligé la premiere partie de l'operateur gaussienne (1/2pi*s*s) je sais pas pq?Car pour implementer les derivées gaussiennes(1 et 2 derivée) je ne sais pas quoi faire?

  12. #12
    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
    Le facteur ne sert à rien ici car on réajuste toutes les valeurs pour que la somme soit égal à un.

    Tu pourras ainsi remarquer que si tu multiplies tout par 1/(2 pi sigma²), le kernelfacteur le sera également. Ce qui fait que dans la division final, ça se simplifiera.

    Le facteur est utile uniquement lorsque l'on passe dans le domaine de Fourier.
    Je ne répondrai à aucune question technique en privé

  13. #13
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Merci,
    donc le matrice que j'aurais après ton algorithme (cad sans le multiplier par le facteur) correspond au masque gaussienne finale (cad je peut le convoluer directement aux images?
    Autre question stp, comment je puisse alors implémenté les dérivées gaussiennes?

  14. #14
    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
    Citation Envoyé par riadh_ado
    donc le matrice que j'aurais après ton algorithme (cad sans le multiplier par le facteur) correspond au masque gaussienne finale (cad je peut le convoluer directement aux images?
    Oui ! C'était fait exprès Les images données en exemple (si tu suis le lien, j'ai appliqué directement la convolution comme ça)

    Citation Envoyé par riadh_ado
    Autre question stp, comment je puisse alors implémenté les dérivées gaussiennes?
    Qu'est ce que tu entends par ça ? Tu parles de dérivée ou de dérivées partielles ?
    Je ne répondrai à aucune question technique en privé

  15. #15
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Dérivée
    Je parle de dérivée première et deuxième (C’est quoi les dérivées partielles?), merci.

  16. #16
    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
    Pour la fonction G(x,y) = Exp[ - (x^2+y^2)/(2*sigma^2) ] à deux variables, la notion de dérivée n'a aucun sens.

    Seul la notion de dérivée partielle en a.

    Par exemple, la dérivée partielle selon x est :
    dG(x,y)/dx = -2x / (2sigma²) exp( - (x^2+y^2)/(2*sigma^2))
    Je ne répondrai à aucune question technique en privé

  17. #17
    Membre régulier Avatar de riadh_ado
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut je compris
    Oui je te comprend on parle des derivée partielle, et pour les autres derivée partielles (dx, dy, dxx,dyy,dxy) comment je peut le faire ( en realité je besoin de dxx et dyy et dxy pour le mettre dans le matrice Hessian pour detecter les lignes? et merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Image] Créer un noyau de convolution gaussien
    Par millie dans le forum Contribuez
    Réponses: 13
    Dernier message: 02/09/2011, 00h47
  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, 18h08
  3. Filtres et noyau de convolution
    Par nicolas66 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 08/04/2005, 14h54
  4. Réponses: 4
    Dernier message: 25/12/2004, 01h03
  5. recherche filtre flou gaussien
    Par gimlithedwarf dans le forum Langage
    Réponses: 4
    Dernier message: 01/08/2002, 22h32

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