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 :

Affichages de fenêtre beaucoup trop long avec imshow() [Python 3.X]


Sujet :

Python

Vue hybride

Tonivege Affichages de fenêtre... 31/12/2017, 01h13
Tonivege Affichage avec Imshow() trop... 07/01/2018, 18h37
wiztricks Salut, Personnellement,... 07/01/2018, 18h54
Tonivege Merci de ta réponse. Je... 11/01/2018, 22h32
wiztricks Toujours pas d'exemple de... 12/01/2018, 10h29
Tonivege Re merci. Mais oui, j'ai... 12/01/2018, 13h31
BufferBob salut, j'ai essayé ce... 12/01/2018, 13h55
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut Affichages de fenêtre beaucoup trop long avec imshow()
    Bonjour,

    J'ai un (gros gros gros....) soucis avec un affichage, il est extrêmement, mais alors vraiment extrêmement long.
    Mon programme lit une image, la tranforme en matrice puis exécute un traitement X fois sur la matrice puis applique le résultat final sur l'image.
    Sur une image donnant une matrice 1000x1000, l'exécution de 5 passages de traitement se réalise en 2s.

    Afin de visualiser le traitement, j'effectue un affichage initiale de l'image puis j'associe un affichage à chaque passage sur la matrice de manière à avoir mes X affichages à l'écran et je réaffiche l'image PNG modifiée.
    Mon problème est qu'avec l'affichage, mon programme s'exécute en plus de ........ 3 heures..... La misère.
    Tout mes affichages sont réalisés avec la commande imshow() de la bibliothèque matplotlib.

    Ma demande est donc, avec python 3.5, quelle commande permet d'afficher plusieurs fenêtre à partir d'un fichier PNG ou vide et d'y dessiner des cercles colorés avec un temps de réponse acceptable.....


    Je schématise mon programme :

    Lecture et affichage d'un fichier PNG :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichierimage = "image.png"
    imagelue = ndimage.imread(fichierimage)
    figure("Image initiale")
    xlabel("Image initiale")
    imshow(imagelue)
    Boucle de mon traitement réalisé X fois
    .....commandes d'affichage de la matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nomaffichage = 'Matrice ' + str(compteurpassage)
    figure(nomaffichage)
    xlabel(nomaffichage)
    imshow(nomaffichage)
    .....Pour chaque élément de la matrice, traitement et dessin d'un cercle coloré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    setp(cercle, 'markersize', surfacecercle)
    setp(cercle, 'markerfacecolor',(couleur1,couleur,couleur2))


    Application du traitement à l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichierimage = "image.png"
    imagelue = Image.open(fichierimage)
    draw=ImageDraw.Draw(imagelue)
    .....Parcours de ma matrice et application d'un cercle sur l'image selon certains critères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    draw.ellipse([j,i,j+delta,i+delta], fill=(c1,c2,c3,c4), outline=(c1,c2,c3,c4))
    .....Puis affichage de l'image modifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    figure("Image modifiée")
    xlabel("Image modifiée")
    imshow(imagelue)

    Voilà, si quelqu'un peut me donner un coup de main pour que ma misère de programme soit utilisable sans que je m'endorme devant mon écran ....

    Un grand merci.

    Au fait, bonne fête de fin d'année à toutes et à tous

  2. #2
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut Affichage avec Imshow() trop long. Quelle solution pour un affichage rapide ?
    Bonjour,

    J'ai un (gros gros gros....) soucis avec un affichage, il est extrêmement, mais alors vraiment extrêmement long.
    Mon programme lit une image, la transforme en matrice puis exécute un traitement X fois sur la matrice puis applique le résultat final sur l'image.
    Sur une image donnant une matrice 1000x1000, l'exécution de 5 passages de traitement se réalise en 2s.

    Afin de visualiser le traitement, j'effectue un affichage initiale de l'image puis j'associe un affichage à chaque passage sur la matrice de manière à avoir mes X affichages à l'écran et je réaffiche l'image PNG modifiée.
    Mon problème est qu'avec l'affichage, mon programme s'exécute en plus de ........ 3 heures..... La misère.
    Tout mes affichages sont réalisés avec la commande imshow() de la bibliothèque matplotlib.

    Ma demande est donc, avec python 3.5, quelle commande permet d'afficher plusieurs fenêtre à partir d'un fichier PNG ou vide et d'y dessiner des cercles colorés avec un temps de réponse acceptable.....


    Je schématise mon programme :

    Lecture et affichage d'un fichier PNG :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichierimage = "image.png"
    imagelue = ndimage.imread(fichierimage)
    figure("Image initiale")
    xlabel("Image initiale")
    imshow(imagelue)
    Boucle de mon traitement réalisé X fois
    .....commandes d'affichage de la matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nomaffichage = 'Matrice ' + str(compteurpassage)
    figure(nomaffichage)
    xlabel(nomaffichage)
    imshow(nomaffichage)

    .....Pour chaque élément de la matrice, traitement et dessin d'un cercle coloré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    setp(cercle, 'markersize', surfacecercle)
    setp(cercle, 'markerfacecolor',(couleur1,couleur,couleur2))


    Application du traitement à l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichierimage = "image.png"
    imagelue = Image.open(fichierimage)
    draw=ImageDraw.Draw(imagelue)
    .....Parcours de ma matrice et application d'un cercle sur l'image selon certains critères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    draw.ellipse([j,i,j+delta,i+delta], fill=(c1,c2,c3,c4), outline=(c1,c2,c3,c4))
    .....Puis affichage de l'image modifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    figure("Image modifiée")
    xlabel("Image modifiée")
    imshow(imagelue)

    Voilà, si quelqu'un peut me donner un coup de main pour que ma misère de programme soit utilisable sans que je m'endorme devant mon écran ....

    Un grand merci.

    Au fait, bonne année à toutes et à tous

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Personnellement, j'ai lu votre prose et je ne comprends pas le problème.
    Déjà, on ne sait pas dans quelle bibliothèque vous êtes allé cherché votre imshow, peut être dans PIL mais çà s'écrit alors (Image).show ensuite, vous dites qu'afficher les images est lent mais vous ne fournissez rien qui permette de reproduire quoi que ce soit.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Merci de ta réponse.

    Je vais essayer d'éclaircir.
    Je veux afficher dans une fenêtre un fichier png.
    Dans une autre fenêtre, je lis des données et selon les données, j'affiche des cercles de couleurs dans cette fenêtre mais aussi dans le fichier png.

    J'utilise la librairie "matplotlib.pyplot" avec imshow() pour :
    - l'affichage d'un fichier image.png
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichierimage = "image.png"
    imagelue = ndimage.imread(fichierimage)
    figure("Image initiale")
    xlabel("Image initiale")
    imshow(imagelue)
    - l'affichage d'une fenêtre avec des cercles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    figure('fenetre')
    imshow(mapblanc)
    setp(cercle, 'markersize', surfacecercle)
    setp(cercle, 'markerfacecolor',(couleur1,couleur,couleur2))
    J'utilise la librairie "PIL import ImageDraw, Image" pour afficher un fichier png et dessiner des cercles dans la fenêtre affichant le fichier png :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichierimage = "imageforet.png"
    imageforet = Image.open(fichierimage)
    draw=ImageDraw.Draw(imageforet)
    draw.ellipse([j,i,j+delta,i+delta], fill=(c1,c2,c3,c4), outline=(c1,c2,c3,c4))
    Image png avec les cercles : Nom : Capture1.PNG
Affichages : 1077
Taille : 116,2 Ko
    fenetre avec des cercles : Nom : Capture2.PNG
Affichages : 1154
Taille : 16,6 Ko

    Voilà, j'espère que cela explique mieux.
    Les temps d'affichages de ces fenêtres sont beaucoup trop long donc je cherche soit à résoudre ce problème soit utiliser d'autres librairies.

    Merci

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Tonivege Voir le message
    Je veux afficher dans une fenêtre un fichier png.
    Dans une autre fenêtre, je lis des données et selon les données, j'affiche des cercles de couleurs dans cette fenêtre mais aussi dans le fichier png.
    Toujours pas d'exemple de code minimal qui montre ou permette de reproduire le problème.
    Et toujours une fixation sur le temps d'affichage de vos images plutôt que de vous questionner sur le code exécuté "autour".
    Peut être qu'en mettant ces affichages en commentaires vous vous poseriez de meilleures questions?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Re merci.

    Mais oui, j'ai positionné des timestamps, l'exécution du programme sur une matrice importante est de moins de 8s.
    L'affichage uniquement de l'image png de 1400x1000 est de quelques minutes (je n'ai pas mon ordi sous la main pour donner le temps exact.... Le ferai ce soir).
    Sachant qu'ensuite j'affiche de 4 à 5 fenêtres avec les cercles ... Cela devient long, du moins pour un programme avec une IHM... J'ai fait un test avec une grosse image et résultat, 1mn de calcul et 3h d'affichages.....
    Et pour le code, j'ai extrait tout ce qui n'avait pas d'intérêt pour ne garder que le code d'affichage. Sinon, faut aussi que je dépose les fichiers de données qui sont lus en amont, bref....
    Mais je pense que pour un test rapide, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from matplotlib.pyplot import *
    fichierimage = "unfichierimage.png"
    imagelue = ndimage.imread(fichierimage)
    figure("Image initiale")
    xlabel("Image initiale")
    imshow(imagelue)
    est suffisant.
    Je vais essayé avec un autre ordi d'ailleurs pour voir le résultat, mais faut que j'installe python....
    Merci

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par Tonivege Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from matplotlib.pyplot import *
    fichierimage = "unfichierimage.png"
    imagelue = ndimage.imread(fichierimage)
    figure("Image initiale")
    xlabel("Image initiale")
    imshow(imagelue)
    j'ai essayé ce code, en récupérant au préalable une image de 1400x1000 pixels en PNG sur le net, pour le moins il manque un from scipy import ndimage, quant à l'exécution elle est pour ainsi dire immédiate (fin du programme, sortie sans erreur), en revanche rien ne s'affiche.

    Citation Envoyé par Tonivege Voir le message
    j'ai positionné des timestamps, l'exécution du programme sur une matrice importante est de moins de 8s.
    au delà des timestamps à la main, tenter de profiler le code est peut être une bonne idée
    un truc du style python -m cProfile script.py, avec éventuellement un tri sur les colonnes jugées pertinentes dans la foulée, à voir...

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,
    Déjà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from matplotlib.pyplot import *
    fichierimage = "unfichierimage.png"
    imagelue = ndimage.imread(fichierimage)
    figure("Image initiale")
    xlabel("Image initiale")
    imshow(imagelue)
    ne fonctionne pas car il manque sans doute l'import de scipy.
    Après si je récupère une image 1400x1000 sur Internet et que je l'affiche avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from PIL import Image
    >>> im = Image.open('test.png')
    >>> im.show()
    >>>
    c'est loin de prendre des minutes mais çà lance un Viewer externe (ce qui prend du temps) car il faut déjà écrire et relire les données sur disque.
    Mais on peut facilement se fabriquer un Viewer "interne":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from PIL import Image, ImageTk
    import tkinter as tk
     
    root = tk.Tk()
    image = Image.open('test.png')
    photo = ImageTk.PhotoImage(image)
    label = tk.Label(image=photo)
    label.pack()
    tk.mainloop()
    qui sera bien plus rapide (pour autant que le problème vienne bien du programme externe).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Tronquer un texte trop long avec …
    Par mestressat dans le forum Langage
    Réponses: 7
    Dernier message: 22/01/2012, 13h15
  2. délai de requête trop long avec sql server
    Par tiferg dans le forum Projets ADP
    Réponses: 0
    Dernier message: 24/03/2010, 08h43
  3. MS SQL 2000 - Job SQL Agent beaucoup trop long
    Par williamc73 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/11/2009, 14h08
  4. Réponses: 5
    Dernier message: 30/03/2006, 11h59
  5. [DELETE]Beaucoup trop long
    Par bourbaki2003 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 23/12/2005, 10h29

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