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 :

Réarranger des stacks d'images


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Réarranger des stacks d'images
    Bonjour ,

    Je fais de la microscopie, et voila plus precisement ce que je fais:
    Je prends une position dans un materiau puis je fais un stack de 10 images en z dans ce materiau. Ensuite 5 minutes plus tard je refais un stack , 10 min plus tard etc..
    Donc au final j'ai x stacks en z à chaque temps.
    Or ce que j'ai besoin de faire, c'est réarranger les stacks pour qu'ils ne soient plus fonction du temps, mais de la position en z.c'est a dire la premiere image du stack 1 avec la premiere image du stack 2 etc.
    Comme je ne suis pas forcement completement clair je joins un schéma de ce que j'aimerai avoir au final.
    http://imageshack.us/photo/my-images...entstacks.jpg/
    Est-il possible de faire ça en python? des bibliothèques qui gèrent les stacks?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Je n'ai pas bien compris quel est le résultat final que tu désires mais apparemment il s'agit de changer l'ordre d'indexation du tableau contenant toutes les images.

    Si l'intégralité de tes données tiens en mémoire, et que tu les a rangées dans un tableau numpy 'a' de taille (ntemps,nz,largeur,longueur) en faisant a.swapaxes(0,1) tu te retrouve avec un tableau de taille (nz,ntzmps,largeur,longeur)

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut, tes images originales sont en tiff, je suppose, regarde ici:

    http://www.developpez.net/forums/d11...f-sous-opencv/

    Pour les "restacker" dans un nouveau fichier, je ne l'ai jamais fait.

    Si tes images ne sont pas en tiff, donnes plus de détails ou éventuellement un fichier exemple.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Mettons que tu aies tes données organisées en liste, au départ sous cette forme*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    in_data = [# t1
               [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10],
               # t2
               [b1, b2, b3, b4, b5, b6, b7, b8, b9, b10],
               # t3
               [c1, c2, c3, c4, c5, c6, c7, c8, c9, c10],
               # etc.
              ]
    … et que tu veuilles obtenir*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    out_data = [# z1
                [a1, b1, c1, ...],
                # z2
                [a2, b2, c2, ...],
                # z3
                [a3, b3, c3, ...],
                # etc.
               ]
    Alors, il suffit de faire*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out_data = list(zip(*in_data))
    Difficile de t’aider plus que ça sans savoir sous quelle forme se présentent tes données (images).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Alors effectivement c'est quasiment le même exemple que edding4, J'ai un stack en tif. Pour splitter le stack original j'utilise PIl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import Image, ImageSequence
     
    im = Image.open("stack.tif")
     
    index = 1
    for frame in ImageSequence.Iterator(im):
        frame.save("pos%d.tif" % index)
        index = index + 1
    je peux donc avoir accès aux images une par une dans un nouveau fichier.
    Le problème c'est que ne parvient pas a les restacker.
    Avec PIl je n'ai pas reussi à le faire , et avec libtiff, j'ai du mal à l'installation, je peux import libtiff mais je n'arrive pas par exemple a importer les modules:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     from libtiff import TIFFfile, TIFFimage
    Mais peut être y a t-il un autre moyen de procéder?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Petite mise à jour, les modules PyLibTiff fonctionnent depuis que je les ai installés depuis http://www.lfd.uci.edu/~gohlke/pythonlibs/
    reste a voir si c'est possible de restacker!

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Libtiff dont je parlais est un front-end à utiliser en ligne de commande donc.

    Pour l'utiliser avec python il faut passer par subprocess.

    Je n'ai pas d'image de ce type sur mon pc, si tu peux nous joindre un exemple, je peux tester ce que tu veux faire.

    Pour Pylibtiff, je ne connaissais pas, parceque pas dans les dépôts de ma version Linux.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci VinsS,
    Je n'ai pas accès aux images ce week end , mais c'est exactement les memes stack que dans le poste que tu as cité plus haut http://www.developpez.net/forums/d11...f-sous-opencv/. Je l'ai récupéré et il est identique, tif 16 bit. Peut être peux tu faire un test avec ce stack. Perso je n'ai pas réussi a restacker les 2.

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    En fait j'en ai construit avec des tiff simples que j'avais.

    Et ça donne ceci avec libtiff et subprocess.

    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
     
    # -*- coding: utf-8 -*-
     
    import sys
    import os
    import subprocess
     
    def unstack(path, pref):
        sp, er = subprocess.Popen(["tiffsplit", path, pref], universal_newlines=True, 
                                    stdout=subprocess.PIPE).communicate()
     
        return er
     
    def stack(imgs):
        imgs.insert(0, "tiffcp")
        sp, er = subprocess.Popen(imgs, universal_newlines=True, 
                                    stdout=subprocess.PIPE).communicate()
     
        return er
     
    if __name__ == '__main__':
        # Images originales
        paths = ["raws_0.tiff", "raws_1.tiff", "raws_2.tiff"]
        for idx, path in enumerate(paths):
            im = "_".join(["img", str(idx)])
            print "Unstack ", path
            uns = unstack(path, im)
            if uns is not None:
                print uns
                sys.exit()
     
        # Les images extraites s'appellent 'img_0aaa.tif', 'img_0aab.tif' ...
        for i in range(97, 100):
            fls = []
            for j in range(3):
                fls.append(''.join(['img_', str(j), 'aa', chr(i), '.tif']))
            fls.append(''.join(['result_', chr(i), '.tiff']))
            # Les nouvelles tiff empilées s'appellerons 'result_a.tiff', 
            # 'result_b.tif', ...
            print "Stack serie:", chr(i)
            st = stack(fls)
            if st is not None:
                print "Failed:", st
     
        print 'done'
    Pour Pylibtiff, j'ai regardé, c'est pas beaucoup mieux documenté, je vois.

    Avec libtiff ce sont les man qui servent de doc, mais il y a un man par fonctionnalité, donc il faut connaître ces fonctionnalités pour commencer.


    J'ai trouvé ceci:

    http://www.remotesensing.org/libtiff/man/index.html


    Edit: J'ai simplifié le code, le retour des commandes est une chaîne vide.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci VinsS,
    Cela dit ça commence à dépasser mes compétences!
    Pour arriver à faire tourner ton script il fait que j'installe libtiff? j'ai essayé à partir du package ici http://gnuwin32.sourceforge.net/packages/tiff.htm , l'ai installé , mais je ne vois pas comment ça fonctionne. En fait j'ai une connaissance plutôt limitée de la manière dont fonctionne les bibliothèques.
    Et a partir de Pylibtiff je ne comprend pas beaucoup mieux comment faire tourner fonctions.

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je suppose que tu es sous Windows et que tu as installé avec l'.exe proposé.

    Dans ce cas, tu ne dois rien faire, le code doit tourner tel quel.

    Tu peux le vérifier directement en rentrant dans une ligne de commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tiffsplit monFichier.tiff
    Si tu retrouves bien les images séparées, alors le code python le fera.
    Si ça retourne une erreur, tu la copies ici.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je suis bien sous windows.
    Si j’écris tiffsplit monFichier.tiff dans idle j'ai:
    SyntaxError: invalid syntax

  13. #13
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Non, pas idle, directement dans une console windows (tiffsplit est un programme “normal”, rien à voir avec python ).

  14. #14
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ah, quand je disais en ligne de commande, ce n'est pas avec python mais dans un terminal.

    Evidemment, il faut changer le nom du fichier aussi.


    Edit: As-tu testé le code avec le fichier exemple ?, Il faut changer le nom du fichier Substack (1-2).tif parceque les parenthèses ne sont pas acceptées.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je n'y comprend pas grand chose..
    Si je lance tiffsplit stack.tiff (mon fichier stacké ) dans l'invite de commande windows
    j'obtiens: "tiffsplit n'est pas reconnu en tant que commande interne ou externe ..."

    Si je lance ton programme en python, après avoir créé les raws_0.tiff raws_1.tiff et raws_2.tiff
    jobtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Unstack  raws_0.tiff
     
    Traceback (most recent call last):
      File "C:\Documents and Settings\Dell\Bureau\restack.py", line 26, in <module>
        uns = unstack(path, im)
      File "C:\Documents and Settings\Dell\Bureau\restack.py", line 9, in unstack
        stdout=subprocess.PIPE).communicate()
      File "C:\Python27\lib\subprocess.py", line 672, in __init__
        errread, errwrite)
      File "C:\Python27\lib\subprocess.py", line 882, in _execute_child
        startupinfo)
    WindowsError: [Error 2] Le fichier spécifié est introuvable

  16. #16
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Et si tu modifies la fin du fichier comme ceci:

    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
     
    if __name__ == '__main__':
        # Images originales
        paths = ["raws_0.tiff", "raws_1.tiff", "raws_2.tiff"]
        for idx, path in enumerate(paths):
     
            # ces trois lignes en plus
            if not os.path.isfile(path):
                print "No such file %s" % path
                break
     
            im = "_".join(["img", str(idx)])
            print "Unstack ", path
            uns = unstack(path, im)
            if uns is not None:
                print uns
                sys.exit()
        ...

  17. #17
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    j'obtiens exactement la même erreur.
    Il y a bien besoin de libtiff pour faire tourner ton script?
    peut-être est-il mal installé? Au début du programme tu ne fais pas appel a libtiff.

  18. #18
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est normal qu'il n'y ait pas d'appel à libtiff en début de code, libtiff n'est pas un module python il n'y a donc pas lieu de l'importer.

    C'est subprocess.Popen() qui l'exécutera comme si tu l'avais entré dans une console.

    J'ai l'impression que cette commande doit différer sous Windows.

    Sur cette page: http://gnuwin32.sourceforge.net/packages/tiff.htm, je lis ceci:
    The GnuWin32 distribution comes in two versions. The ordinary version uses the standard Unix equivalents, such as fopen and read, for input and output, the other version (Tiff-win32) uses the Win32 API functions, such as CreateFile and ReadFile, for input and output. The ordinary version (Tiff) is more suitable for porting Unix programs, the Win32-API version is more suitable for writing Win32 programs.
    Il y a bien deux versions Win différentes proposées au téléchargement.

    La tiff-win32-3.8.1-2 appellée version 'ordinaire' ci-dessus
    http://sourceforge.net/projects/gnuw...1.exe/download


    Et la version 'pure Windows' tiff-win32-3.6.1-2
    http://sourceforge.net/projects/gnuw...2.exe/download


    J'ai comme l'impression que cette deuxième version ne permet pas l'usage qui en est fait dans mon code exemple. Ce qui expliquerait ton message:
    Si je lance tiffsplit stack.tiff (mon fichier stacké ) dans l'invite de commande windows
    j'obtiens: "tiffsplit n'est pas reconnu en tant que commande interne ou externe ..."
    (À moins qu'il n'ait fallut donner le chemin complet de tiffsplit)

    Hélas sous Windows, je risque mal de t'être d'un grand secours.

  19. #19
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Je crois bien que sous windows, il faut donner le chemin complet d’un programme, dans la console (ah, windows… ).

  20. #20
    Futur Membre du Club
    Homme Profil pro
    fac
    Inscrit en
    Octobre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : fac
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci pour ces explications,
    je vais essayer de fouiller un peu dans ce sens pour arriver à faire tourner libtiff avant de revenir au code! Dommage qu'il n'y ai pas une librairie simple sous python du type im=restack()

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Créer des masques pour un stack d'image
    Par LunDarkMiel dans le forum ImageJ
    Réponses: 5
    Dernier message: 08/02/2014, 06h29
  2. Liste des sites avec images libres de droits
    Par SteelBox dans le forum Imagerie
    Réponses: 19
    Dernier message: 06/01/2011, 15h38
  3. Trouver des centres de particules sur stack d'images en Z
    Par babarpapa dans le forum Traitement d'images
    Réponses: 19
    Dernier message: 03/11/2006, 08h30
  4. Arrondir des coins sans image
    Par eric30eric dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/02/2004, 23h31
  5. recherche des algorythmes pour images 2d
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/05/2002, 13h46

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