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

Calcul scientifique Python Discussion :

Analyse d'images sous python


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Analyse d'images sous python
    Bonjour,

    je cherche à faire une moyenne d'une centaine d'images qui sont sous tiff.
    Pour l'instant j'ai le programme :


    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
    import os, numpy, PIL
    from PIL import Image
     
     
    os.chdir("D://AMELIE//ESSAI_1//" )
    print "Current working dir : %s" % os.getcwd()
     
    allfiles=os.listdir(os.getcwd())
    imlist=[filename for filename in allfiles if  filename[-5:] in [".tiff",".tiff"]]
     
     
     
    w,h=Image.open(imlist[0]).size
    N=len(imlist)
     
     
    arr=numpy.zeros((h,w,1),numpy.float)
     
     
    for im in imlist:
        imarr=numpy.array(Image.open(im),dtype=numpy.float)
        arr+=imarr/N
        N=float(N)
     
     
     
    arr=numpy.array(numpy.round(arr),dtype=numpy.uint8)
     
     
    out=Image.fromarray(arr,mode="F")
    out.save("Average.tiff")
    out.show()

    Mais j'ai comme message d'erreur : operands could not be broadcast together with shapes (1200,1920,1) (1200,1920) (1200,1920,1)

    Je n'arrive pas à identifier l'erreur, merci de votre aide

  2. #2
    Membre du Club

    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 19
    Points : 53
    Points
    53
    Par défaut
    Bonsoir,

    Tu donnes une dimension supplémentaire à ton tableau qui représente l'image finale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arr = numpy.zeros((h, w, 1), numpy.float)
    Alors que les tableaux de la boucle sont en 2d:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imarr = numpy.array(Image.open(im), dtype=numpy.float)
    D'où l'erreur de concaténation.

    Ceci a fonctionné pour moi:
    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
    import os, numpy, PIL
    from PIL import Image
     
    os.chdir("/home/..." ) #ton chemin
     
    dir_files = os.listdir(os.getcwd())
    tiff_files = [filename for filename in dir_files if filename[-5:] == ".tiff"]
     
    width, height = Image.open(tiff_files[0]).size
    image_amount = len(tiff_files)
     
    average = numpy.zeros((height, width), dtype=numpy.float)
     
    for file in tiff_files:
        image = numpy.array(Image.open(file), dtype=numpy.float)
        average += image / image_amount
     
    average = numpy.array(numpy.round(average), dtype=numpy.uint8)
     
    out = Image.fromarray(average)
    out.save("Average.tiff")
    out.show()
    Il est aussi possible d'utiliser la fonction mean() de numpy. C'est certes plus compact mais au bout d'un seuil le temps d'exécution n'est plus compétitif face à la boucle (car on effectue des opérations sur des tableaux volumineux qui prennent beaucoup de mémoire):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import os, numpy, scipy
    import matplotlib.pyplot as plt
     
    os.chdir("/home/..." ) #ton chemin 
    dir_files = os.listdir(os.getcwd())
    tiff_files = [filename for filename in dir_files if filename[-5:] == ".tiff"]
     
    images = numpy.array([numpy.array(scipy.misc.imread(file), dtype=numpy.float) for file in tiff_files])
    average = numpy.array(numpy.round(numpy.mean(images, axis=0)), dtype=numpy.uint8)
     
    plt.imshow(average, cmap=plt.cm.gray)
    plt.show()

Discussions similaires

  1. Analyse d'image PYthon : Quel OS ?
    Par ImagingAllthe dans le forum Général Python
    Réponses: 7
    Dernier message: 14/06/2013, 08h59
  2. Mettre une Image dans un Text() sous Python 3
    Par sancho.poncho dans le forum Tkinter
    Réponses: 6
    Dernier message: 07/07/2012, 11h41
  3. python comme CGI - affichage d'images sous HTML
    Par pschmidtke dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 30/07/2009, 10h49
  4. Afficher des images sous directX
    Par cyberlewis dans le forum DirectX
    Réponses: 17
    Dernier message: 12/07/2004, 12h07
  5. Affichage d'une image sous linux
    Par Braim dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 25/03/2003, 10h41

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