Partage
  • Partager sur Facebook
  • Partager sur Twitter

Histogramme d'une image

    17 décembre 2016 à 15:33:30

    Bonjour à tous ! 

    Je suis en classe prépa et dans le cadre d'un projet je dois créer un programme python me permettant d'obtenir l'histogramme d'une image ( graphique ainsi que les valeurs  )

    Je reste débutant en programmation, et je n'ai pas de grande connaissances des bibliothèques python, est-ce que l'une d'entre elles pourraient venir à mon secours ? 

    Si ce n'est pas le cas voici ce que j'ai programmé pour linstant : 

    L'idée générale est de compter le nombre de pixel par couche ayant la même valeur et de représenter en abscisse de l'histogramme la valeur de chaque pixel, et en ordonnée son nombre d’occurrence. 

    J'ai d'abord créé ce programme pour compter le nombre d'apparition des éléments, sachant qu'il doit mettre des 0 pour les éléments qui n'apparaissent pas. 

    def compteur(L):
        n=len(L)                                # Mesure de la longeur de la liste
        a=L[0]                                  # a prendre la valeur du premier element de la liste
        c=0                                     # le compteur d apparitin c est initialise a 0
        J=[]                                    # la liste J va stocker les valeurs de c
        for i in range(n):                      # on parcourt toute la liste
            if L[i]==a:                         # si la valeur de L est identique a la precedente, on inscremente c
                c+=1
            else:                               # 
                delta=L[i]-a                    # on calcule l'ecart entre la nouvelle valeur et l ancienne
                delta=int(delta)                # on transforme cette valeur en entier
                J.append(c)                     # on stocke la valeur de c ( qui a compte le nombre d occurance de la precedente valeur )
                if delta >1:                    # si les deux valeurs ne se suivent pas directement, on ajoute des zeros pour les valeurs absentes
                    
                    for v in range(delta-1):
                        J.append(0)
                c=0                             # on remet le compteur a 0
                c+=1                            # on compte cette nouvelle valeur
                a=L[i]                          # a prend cette nouvelle valeur
                
            if i==n-1:                          # quand on arrive au dernier element, on stocke c dans la liste car plus de comparaison apres cet element
                J.append(c)                     
        return J



    Pour ce qui est de l'histogramme en lui-même : 

    def histogramme():
        """Renvoi l'histogramme noir et blanc d'une image au format PNG"""
        a=img.imread('nom_de_limage')           # importe l'image en python attention format PNG uniquement sous forme de tableau
        G=[]                                    # initialisation de la variable qui va prendre la valeurs de chaque pixels et de la liste G qui va stocker les valeurs de W
        W=0
        (nligne,ncolonne,ncouche)=np.shape(a)   # creaton d'un tableau 3D a partir de l image
        a_wb=np.zeros([nligne,ncolonne])        # creation d'un tableau pour la couche noire et blanc avec des zeros dedans 
        for n in range(nligne):                 # on parcourt l'image ligne par ligne, colonne par colonne, couche par couche ( 1 couche wb, 3 couches pour RVB )   
            for p in range(ncolonne):
                M=0
                for k in range(ncouche):
                    M+=a[n,p,k]                 # la variable M prend la valeur du pixel qui est en train d'etre scanne
                    M=M/3                       
                    a_wb[n,p]=M
                W=a[n,p,1]                      # W prends la valeur du pixel sur la couche 1, c'est a dire la couche wb
                G.append(W)                     # Les valeurs de W sont stockees dans la liste G 
        G2=np.sort(G)                           # renvoi la liste G sous forme d array et triee par ordre croissant
        G3=255*G2                               # multiplication pour avoir des valeurs entre 0 et 255 
        G4=list(G3)                             # transformation de G2 de array en une liste
        G5=compteur(G4)                         # G3 est la liste du nombre d'apparition de chaque valeurs de la liste G2
        x=list(range(256))                      # creation de la liste des abscisses 
        plt.plot(x,G5)                          # tracee de l histogramme
        #plt.savefig('histogramme images3')      # sauvegarde de l'image 


    Malheureusement ce dernier ne fonctionne pas, les listes obtenues ont une longueur bien supérieure à 255 et je ne sais pas d'où vient ce problème...

    Quelqu'un pourrait-il m'aider ? 

    Une autre question : puis-je traiter des images d'un format différent de png avec python ? 

    Merci d'avance ! :)

    -
    Edité par Pythonislife 17 décembre 2016 à 15:34:05

    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2016 à 19:49:12

      Bonsoir,

      Tout d'abord, au niveau des modules les plus simples pour gérer les images et les pixels tu a Pillow, le module PIL.

      Ce que tu peux faire, si j'ai bien compris l'objectif, c'est d'ouvrir ton image, regarder ses dimensions et alors créer des listes en fonction de celles-ci.

      Du coup tu récupère le RVB de ton pixel pour le traiter, puis tu l'insert dans ta liste.

      Je pense aussi que l'utilisation des matrices avec numpy sera plus simple étant donné la composition de 3 couleurs pour 1 pixel.

      j'espère ne pas être hors sujet et bonne soirée !

      • Partager sur Facebook
      • Partager sur Twitter
      fabien

      Histogramme d'une image

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown