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 :

Calcul d'une matrice Laplacienne gaussienne


Sujet :

Traitement d'images

  1. #1
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 763
    Points : 4 067
    Points
    4 067
    Billets dans le blog
    2
    Par défaut Calcul d'une matrice Laplacienne gaussienne
    Bonjour à tous je souhaite pouvoir appliquer des effets de convolution et en ce moment ce sont les matrices LOG "Laplace of Gaussian" pour ce faire je calcul la matrice comme ceci

    Code pascal : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    function ComputeGaussian(x, Sigma : Single) : Single;
    begin
      Result := System.exp(((-x * x) / ( 2 * Sigma * Sigma)));
    end;  
     
    function ComputeLoG(x, Sigma : Single) : Single;
    var
      g : Single;
    begin
      g := ComputeGaussian(x,Sigma);
      Result := (x * x - 2 * Sigma * Sigma) / (Math.power(Sigma,4)) * g;
    end;  
     
    function ComputeLOGKernel(Var KernelSize : Integer; Weight : Single) : TBZDynSingleArray;
    Var
      KernelRadius : Integer;
      x, y , i, j : Integer;
      s, Sum, Dist, Theta, f, xx,yy : Single;
      t, KSize : Integer;
      //OutMatrix : Array of Single;
    begin
      s := weight - 0.8;
      // t := Round(3.35 * s + 0.33);
     //KernelSize := 2 * t + 1;
      KernelRadius := KernelSize div 2;
      KSize := KernelSize  * KernelSize;
      SetLength(Result,  KSize );
      Sum := 0;
      Dist := 0;
      for y := -KernelRadius to KernelRadius do
      begin
        j := (y + KernelRadius);
        yy := y; //j - t;
        yy := yy * yy;
        j := j * KernelSize;
        for x := -KernelRadius to KernelRadius do
        begin
          i := x + KernelRadius;
          xx := x; //i - t;
          xx := xx * xx;
          Dist := System.Sqrt(xx + yy);
          f := ComputeLOG(Dist, s);
          Result[j + i] := f;
          Sum := Sum + f;
        end;
      end;
      // normalisation
      Theta := 1.0 / Sum;
      for x := 0 to (KSize-1) do Result[x] := Result[x] * Theta;
    end;

    Seulement le résultat n'est pas celui au quel je m'attend

    Quel est votre avis ? mes calcul sont-ils juste ?

    Voici l'image originale de test

    Nom : lenna-noisy.png
Affichages : 96
Taille : 167,2 Ko

    et le résultat avec une matrice générée de 7x7

    Nom : 2020-04-27_093159.png
Affichages : 94
Taille : 221,7 Ko

    Merci d'avance pour votre aide

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 763
    Points : 4 067
    Points
    4 067
    Billets dans le blog
    2
    Par défaut
    Je ne suis pas certain que ma fonction soit exacte mais mon implémentation de l'algorithme de Marr–Hildreth semble être bonne

    Nom : 2020-04-27_134635.png
Affichages : 70
Taille : 22,6 Ko

    Je suis preneur de toutes explications quand même

    Merci
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 1 176
    Points : 2 280
    Points
    2 280
    Billets dans le blog
    9
    Par défaut Calcul d'une matrice Laplacienne gaussienne
    Bonjour,

    Un détail, simplement: pourquoi les variables au format Integer ne sont-elles pas déclarées sur une même ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function ComputeLOGKernel(Var KernelSize : Integer; Weight : Single) : TBZDynSingleArray;
    Var
      KernelRadius : Integer;            
      x, y , i, j : Integer;
      s, Sum, Dist, Theta, f, xx,yy : Single;
      t, KSize : Integer;
     //OutMatrix : Array of Single;                            ... / ...
    On pourrait écrire par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function ComputeLOGKernel(Var KernelSize : Integer; Weight : Single) : TBZDynSingleArray;
    Var
      KernelRadius : Integer;   
      i, j, KSize, t, x, y: Integer;
      s, Sum, Dist, Theta, f, xx,yy : Single;
     //OutMatrix : Array of Single;                            ... / ...
    J'avoue aussi ne pas comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        yy := y; //j - t;
        yy := yy * yy;
        j := j * KernelSize;
        for x := -KernelRadius to KernelRadius do
        begin
          i := x + KernelRadius;
          xx := x; //i - t;
          xx := xx * xx;
    Le transtypage n'est-il pas automatiquement effectué au cours des instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    yy:= Sqr(y);
     ... / ... xx:= Sqr(x);
    Il m'est arrivé de me poser des questions analogues avec Virtual Pascal: aucun ennui n'est apparu.

    # En ce qui concerne la première matrice, il m'aurait paru naturel d'établir la moyenne à l'intérieur d'un cercle centré sur le pixel visé, donc d'annuler les éléments de la matrice situés plus loin; ce que font en gros les instructions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ComputeGaussian(r, s : Single) : Single;
    var u: Single;
    begin
      u:= Sqr(r/s); Result := System.exp(-u/2)       
    end; 
     
    ... / ...   // Pour le calcul de la matrice:
    Ks2:= Sqr(KernelSize);
    R2:= xx + yy;
    IF R2>Ks2 THEN M[i, j]:= 0 ELSE M[i, j]:= ComputeGaussian(d, Sigma)
    Il est par ailleurs possible de diminuer le nombre d'instructions, en ne calculant pas la distance elle-même, mais seulement son carré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D2:= xx + yy; S2:= Sqr(Sigma);
     ... / ...
    function ComputeGaussian(R2, S2 : Single) : Single;
    var u: Single;
    begin
      u:= R2/S2; Result := System.exp(-u/2)       
    end;
    http://fourier.eng.hmc.edu/e161/lect...ent/node8.html


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 763
    Points : 4 067
    Points
    4 067
    Billets dans le blog
    2
    Par défaut
    Bonjour
    Citation Envoyé par wiwaxia Voir le message
    Bonjour,

    Un détail, simplement: pourquoi les variables au format Integer ne sont-elles pas déclarées sur une même ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function ComputeLOGKernel(Var KernelSize : Integer; Weight : Single) : TBZDynSingleArray;
    Var
      KernelRadius : Integer;            
      x, y , i, j : Integer;
      s, Sum, Dist, Theta, f, xx,yy : Single;
      t, KSize : Integer;
     //OutMatrix : Array of Single;                            ... / ...
    On pourrait écrire par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function ComputeLOGKernel(Var KernelSize : Integer; Weight : Single) : TBZDynSingleArray;
    Var
      KernelRadius : Integer;   
      i, j, KSize, t, x, y: Integer;
      s, Sum, Dist, Theta, f, xx,yy : Single;
     //OutMatrix : Array of Single;                            ... / ...
    Exacte, c'est juste une habitude que j'ai de séparer mes variables de boucle des autres. Ca n'a pas aucune incidence sur le code, c'est juste plus clair pour moi.

    Citation Envoyé par wiwaxia Voir le message
    J'avoue aussi ne pas comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        yy := y; //j - t;
        yy := yy * yy;
        j := j * KernelSize;
        for x := -KernelRadius to KernelRadius do
        begin
          i := x + KernelRadius;
          xx := x; //i - t;
          xx := xx * xx;
    Le transtypage n'est-il pas automatiquement effectué au cours des instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    yy:= Sqr(y);
     ... / ... xx:= Sqr(x);
    Il m'est arrivé de me poser des questions analogues avec Virtual Pascal: aucun ennui n'est apparu.
    ;

    le doublement ici, c'est juste à cause de ce qui est commenté à coté. Pour ce qui est de Sqr, je ne l'utilise presque jamais.

    Citation Envoyé par wiwaxia Voir le message
    # En ce qui concerne la première matrice, il m'aurait paru naturel d'établir la moyenne à l'intérieur d'un cercle centré sur le pixel visé, donc d'annuler les éléments de la matrice situés plus loin; ce que font en gros les instructions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function ComputeGaussian(r, s : Single) : Single;
    var u: Single;
    begin
      u:= Sqr(r/s); Result := System.exp(-u/2)       
    end; 
     
    ... / ...   // Pour le calcul de la matrice:
    Ks2:= Sqr(KernelSize);
    R2:= xx + yy;
    IF R2>Ks2 THEN M[i, j]:= 0 ELSE M[i, j]:= ComputeGaussian(d, Sigma)
    Le fait de centré sur le pixel est beaucoup plus pertinent.
    Ce genre de chose n'est pas naturel chez moi et les maths
    Je suppose ici que d := sqrt(R2), non ?

    Citation Envoyé par wiwaxia Voir le message
    Il est par ailleurs possible de diminuer le nombre d'instructions, en ne calculant pas la distance elle-même, mais seulement son carré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D2:= xx + yy; S2:= Sqr(Sigma);
     ... / ...
    function ComputeGaussian(R2, S2 : Single) : Single;
    var u: Single;
    begin
      u:= R2/S2; Result := System.exp(-u/2)       
    end;
    http://fourier.eng.hmc.edu/e161/lect...ent/node8.html
    Bon à savoir, cette astuce

    Merci wiwaxia, je fait faire quelques tests maintenant
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 763
    Points : 4 067
    Points
    4 067
    Billets dans le blog
    2
    Par défaut
    Après quelques tests, le fait de centrer la matrice donne de meilleurs résultats avec mon algo de Marr–Hildreth. Le choix des Sigma est plus cohérent.

    Merci
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. [Débutant] Calcul d'une Matrice d'autocorrélation R
    Par ButterflyLady dans le forum Signal
    Réponses: 0
    Dernier message: 27/12/2010, 11h45
  2. [SSRS] [2K5] Probleme calcul dans une matrice
    Par boutinj dans le forum SSRS
    Réponses: 3
    Dernier message: 10/11/2010, 12h30
  3. Calcul d'une matrice de Variance Covariance
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/05/2010, 17h22
  4. Calculs sur une matrice
    Par tarek30 dans le forum JBuilder
    Réponses: 2
    Dernier message: 22/04/2009, 13h21
  5. Calcul d'une matrice dans une boucle for
    Par david_Montreal dans le forum MATLAB
    Réponses: 7
    Dernier message: 11/07/2007, 17h17

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