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

Python Discussion :

Tracer une courbe de densité de Kernel (Gauss/'best fit' line) sur un histogramme [Python]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2022
    Messages : 2
    Par défaut Tracer une courbe de densité de Kernel (Gauss/'best fit' line) sur un histogramme [Python]
    Bonjour,

    je travaille actuellement sur la caractérisation d'une camera CMOS et pour cela je suis amené a prendre des images (dark ou illuminées selon ce que je cherche a calculer) pour essayer d'en tirer un maximum d'informations pour les comparer avec celles données en datasheet (gain, dynamique, dark current... bref).

    Je me suis fait un "petit" code qui me permet de faire pas mal de choses (routines : moyenne/soustraction de deux images 16-bit), surtout plus rapidement que si je devais passer par un logiciel de traitement scientifique d'images comme ImageJ qui certes fonctionne bien avec les bonnes macros/plugins etc. mais Python est plus dans l'air du temps et me permet de faire bien plus avec beaucoup plus de libertés au niveau personnalisation de graphiques ou même tout simplement dans la visualisation de mes frames.

    Bon assez discuté. En bref j'ai une fonction "def histRoutine" qui me permet de tracer les histogrammes de mes images selon le temps d'exposition (de 1 a 10 secondes donc 10 images) et j'ai ajouté une ligne verticale qui indique ou se situe la valeur moyenne avec "plt.axvline".

    J'aimerais maintenant ajouter une courbe de densité de Kernel (Courbe de Gauss) sur mon histogramme (le nombre de bins peut être modifiée bien entendu) mais j'ai essayé de plusieurs manières (Matplotlib, pandas et autres) et je n'obtiens pas le résultat escompté.

    Il faudrait apparemment utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    y = ((1/(np.sqrt(2*np.pi)*x))*np.exp(-0.5*(1/y*(bin_list - x))**2))
    plt.plot(bin_list, y, '--', color ='black')
    J'espère avoir été clair, et vous remercie par avance pour votre aide . Si vous avez des questions n’hésitez surtout pas. (images et code .py en pièce jointe -> chemin de fichier absolu a modifier avant de compiler)

    Le fichier .zip contenant les images au format .tiff 16-bit semble trop lourd (30 mb). Je peux vous le transmettre par email ou autres, si vous avez des idées.




    Voici quelques liens qui pourraient peut-être aider :
    - https://www.geeksforgeeks.org/matplo...ist-in-python/
    - https://matplotlib.org/stable/galler...e-histogram-py
    - https://www.tutorialspoint.com/drawi...-in-matplotlib
    - https://towardsdatascience.com/take-...b-5f093ad7b9d3
    - https://matplotlib.org/stable/galler..._features.html
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 661
    Par défaut
    Salut,

    Et bienvenu. Si tu n'es pas contre l'idée d'utiliser un module pour calculer et tracer cette fonction densité, tu peux jeter un oeil du côté de seaborn ou de scipy. Un rapide check m'a conduit sur cette réponse sur Stackoverflow : https://stackoverflow.com/questions/...am-values-only. Il me semble que cela devrait répondre, à priori (sans avoir pris le temps de checker ton code, désolé), à ton besoin.

    A première vue, il faudrait rajouter à ta fonction histRoutine() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kde = stats.gaussian_kde(frame)
    plt.plot(bin_list, kde.pdf(bin_list), label='KDE')
    Attention toutefois, dans cette fonction frame est modifié à plusieurs reprises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    frame = frame_stack[:, :, idx]
    ...
    frame, bin_list, patches = plt.hist(frame.ravel(), bin_list, alpha = 0.7)
    frame = frame.astype('int')
    J

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2022
    Messages : 2
    Par défaut
    Salut,

    Merci pour ta réponse.

    J'ai essayé avec le code que tu m'a déposé et on devine une courbe mais elle est collée a l'axe des abscisses donc il y a encore un soucis.

    Concernant frame je ne pense pas que ça pose problème mais je vais sûrement retravailler la fonction.
    Images attachées Images attachées  

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 661
    Par défaut
    Salut,

    A vu de nez, je dirais que le problème vient des unités. Le kernel, tel que calculé dans le lien que j'ai fourni, est normalisé. L'aire sous la courbe du kernel est de 1. Clairement pas le cas de ton histogramme. Ce qui expliquerait que le tracé soit totalement écrasé. Pour illustrer mon propos :

    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
    import numpy as np
    import scipy.stats as sts
    import matplotlib.pyplot as plt
     
     
    # Generate data
    n_points = 10000
    n_bins = 20
    data = np.random.normal(loc=0.0, scale=1.0, size=n_points)
     
    # Kernel
    kde = sts.gaussian_kde(data)
     
    fig, ax = plt.subplots(1)
    bar, bins, _ = ax.hist(data, bins=n_bins)
     
    # On trace le kernel. On met à l'échelle pour avoir la même aire sous la courbe
    density = np.sum(bar * np.diff(bins)) 
    x = np.linspace(data.min(), data.max())
    y = kde.pdf(x) * density
    ax.plot(x, y, c='orange', label='KDE')
     
    plt.show()
    Petit conseil, essaie de fournir un bout de code simplifié qui permet de rejouer le problème en faisant un simple copié-collé. Bien plus facile pour ceux qui voudraient répondre. Et bien souvent, le simple fait de faire cet effort, on trouve son problème

    J

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/09/2014, 23h08
  2. Tracer une courbe dans un formulaire ?
    Par jessy212 dans le forum Access
    Réponses: 5
    Dernier message: 04/09/2006, 16h46
  3. Tracer une courbe avec 2 tableau de points
    Par babarpapa dans le forum 2D
    Réponses: 3
    Dernier message: 19/04/2006, 15h24
  4. [Images] [Librairie] Tracer une courbe ???
    Par cedre22 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 20/02/2006, 14h53
  5. Tracer une courbe théorique sur un TChart
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/09/2005, 11h46

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