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

MATLAB Discussion :

Détecter les pics d'un histogramme


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut Détecter les pics d'un histogramme
    Bonjour,
    je me sers actuellement de la fonction hist sous matlab pour créer un histogramme d'un contour d'une image représentant une forme à symétrie de révolution. Certaines parties de cette forme sont côniques, d'autres cylindriques. Je recherche le diamètre des parties cylindriques (toutes sont coaxiales), du coup je repère les pics de l'histogramme (les parties côniques ne donnant pas de max mais un étalement des rayons).

    Jusqu'à présent je n'avais que des formes simples avec un ou deux pics, mais désormais je peux en avoir 4 ou 5. J'aimerais savoir comment extraire les diamètres auxquels correspondent ces pics.

    Voici un exemple d'histogramme en pièce jointe.
    Pour extraire le pic le plus gros, je cherche l'indice du rayon max :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indicermax=find(histo==max(histo), 1, 'last' );
    et pour un segment de longueur 7 batons centré autour du max je fais la moyenne pondérée, pour obtenir le rayon max moyen (sur l'histo joint mon programme détecte donc le pic le plus important, et me donne alors un rayon moyen de 390.8 µm). L'idée est donc d'avoir plusieurs rayons max, comment faire ? Y a-t-il un moyen sous matlab de détecter des pics étalés comme ceux vers 170 µm, 390 µm et 590 µm par exemple (ceux au-delà sont plus compliqués) ? Merci d'avance de votre aide.
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Je pense que ton problème est un problème de recherche de maxima locaux...

    X = [x1 x2 x3 x4 x5 x6 x7 x8];

    tu regardes si x(i) est supérieur à x(i-1) et x(i-3).

    C'est l'idée, tu peux y ajouter des conditions par rapport à x(i-2) et x(i+2)...

    J'espère que ça t'aidera...

    Christophe

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut
    Le problème est l'hétérogénéité des pics... Le premier par exemple est très étalé et ne monte pas très haut. Il y a de plus deux max proches et un creux entre les deux. Les pics isolés entourés uniquement de barres aux probabilités décroissantes (sans creux, sans remontée etc...) sont très rares d'où mon problème il faudrait des tonnes de conditions en fait sur les barres avoisinantes, et finalement je me demande si le plus simple ne serait pas plutôt de fractionner l'histogramme en plusieurs et de réitérer ce que je fais déjà... Le problème étant qu'il faudrait un fractionnage "intelligent". D'où ma question de savoir si les développeurs matlab ne se sont pas déjà penchés là-dessus (ou un utilisateur du forum).

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Je comprends, c'est plus un problème d'algorithme...

    Christophe

  5. #5
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    Il faut lisser ton histo pour localiser les pics.
    Quand tu as le lieu approximatif des pics, tu calcule leur caractéristique exacte par la méthode que tu as déja employée.

    ci-dessous un code qui te fait ça.
    Dans l'exemple, des pics propres, puis bruités.
    J'applique une largeur fixe de pic (5 cases), mais tu peux retravailler ça si tu veux. De toutes façon seule la hauteur du pic est sensible à la largeur de calcul. La localisaton en X ne changera pas beaucoup si tu la calcule su 5, 7 ou 9 barres.

    La méthode n'est pas très sensible à la largeur de la fenêtre du lissage. Tu choisis donc une fenêtre qui te va bien et basta.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    figure(1), hold off
    H = [0 1 2 3 4 5 4 3 2 1 0 0 0 0 0 1 3 5 7 9 7 5 3 1 0 0 0 0 0 1 2 3 4 5 6 7 8 9 7 5 3 1 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 1 2 3 1 4 3 4 0 1 0 1 2 3 1 0 1 3 4 5 7 1 9 5 4 3 1 1 0 2 0 1 3 1 9 1 9 0 0 1 0 1 2 3 1 0 1 2 1 5 5 7 1 5 0 4 1 ].^2 ;
    X = 1:length(H) ;
    stairs(X, H)
     
    S0 = cumsum(H) ;
    S1 = cumsum(H .* X) ;
    % si i est le lieu approximatif d'un pic,de largeur +/-2, alors les
    % coordonées exactes du pic sont :
    % x = (S1(i+2)-S1(i-2))/(S0(i+2)-S0(i-2))
    % h = (S0(i+2)-S0(i-2))/5
     
    figure(2), hold off
    plot(X, S1)
     
    % Lissage du signal cumulé. optimiser winl selon le problème
    % Deux options de lissage :
     
    % option 1 : savisky-golay
    % Nécessite la sinal processing toolbox
    winl = 4 ; % taille de la demi-fenêtre de lissage
    winl2 = 2*winl + 1 ; % la fenêtre finale doit être symétrique
    Ss = sgolayfilt(S0,2,winl2) ;
     
    % % option 2 : moyenne glissante.
    % % si tu n'as pas la sinal processing toolbox
    % % active le code ci-dessous à la palce de la ligne 'Ss = sgolayfilt(S0,2,winl2) ;
    % filter = [ 1:winl winl winl:-1:1] ;
    % filter = filter / sum(filter) ;
    % Sc = conv(S0, filter) ;
    % Sc = Sc((winl+1):(end-winl)) ;
     
    hold on
    plot(X, Ss, 'r')
     
    dSs = [0 diff(Ss)] ; % je veux les max locaux de cette fonction
    figure (3), hold off
    plot(X, dSs)
     
    i = find (dSs > dSs([1 1:end-1]) & dSs > dSs([2:end end])) ;
     
    Xpic = (S1(i+2)-S1(i-2))./(S0(i+2)-S0(i-2)) ;
    Ypic = (S0(i+2)-S0(i-2))/5 ;
    [unused j] = sort (Ypic) ;
     
    figure (1), hold on
    plot(Xpic, Ypic, 'ro')
     
    disp ('les 7 plus gros pics sont')
    disp ('Xmoyen    Y moyen')
    j = j(end:-1:end-7) ;
    disp([Xpic(j) ; Ypic(j)]') ;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Par défaut
    Nickel ce petit programme, merci beaucoup, je connaissais pas sgolayfilt.

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

Discussions similaires

  1. [Cookies] Détecter les cookies
    Par kot dans le forum Langage
    Réponses: 9
    Dernier message: 11/10/2005, 11h40
  2. Détecter les états des boutons (enfoncé, relaché)
    Par Tray dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/03/2005, 21h12
  3. [C#] Détecter les changemens d'un élément (CollectionBase)
    Par Erakis dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/02/2005, 04h31
  4. coment détecter les positions des cotés d'un rectangle?
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/01/2005, 11h26
  5. comment détecter les faces d'un mur
    Par einegel dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 18/01/2005, 00h12

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