Partage
  • Partager sur Facebook
  • Partager sur Twitter

Traitement d'image

Sujet résolu
    16 novembre 2010 à 10:32:08

    Bonjour,

    Voilà, j'ai un projet à faire pour ça, j'ai quelques trucs à faire sur des images PPM.
    Je pense que ça ira mais je n'arrive pas à ouvrir le fichier en tant que matrice. Quand j'ouvre le fichier, j'obtiens un truc du genre:
    ['P6\n', '# CREATOR: GIMP PNM Filter Version 1.1\n', '600 375\n', '255\n', '\x0f\x1c$\x13 (\x13 (\x0f\x1c%\x10\x1d&\x12\x1f(\x13 )\x15"+\x12 +\x0e\x1f)\x11",\x15\'1\x14&0\x14%/\x15&.\x18&/\x19\'0\x16$-\x13!*\x12 )\x10!)\x12#+\x13$.\x12#-\x16".\x13 )\x15"+\x18%-\x17$,\x15#,\x17%.\x18&1\x15&0\x16\'1\x19\'2\x1f-6 .7 19%8?!5<"3;\x1e/6\x1d,3\x18\'.\x1b(0\x1b(0\x15"*\x18%+']

    Je n'obtiens donc pas de liste de liste, que faire? Le P6 signifie que je suis dans le format binaire, mais je dois être dans le format P3 (ASCII ou brute pour les intimes). Normalement, je devrais avoir dans l'ordre :
    – Identificateur du fichier ; dans le cas de PPM brute, on a toujours P3 ;
    – Nombre de colonnes de l’image ;
    – Nombre de lignes de l’image ;
    – Valeur maximale dans les matrices des intensités.

    Que faire? voici mon code =D

    def ouvrir(path):
        image=open(path,"r")
        matrice=image.readlines()
        print matrice
        return matrice
        
    
    ouvrir('./image.ppm')
    


    Ensuite, j'aurais un petit problème, après modification de cette image, je fais comment pour enregistrer un nouveau fichier à partir de la nouvelle image?

    quelque chose du genre :
    def save(matrice):
        matrice=file('./imageout.ppm')
    


    ?

    merci de votre aide =)
    • Partager sur Facebook
    • Partager sur Twitter
    « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
      16 novembre 2010 à 12:07:16

      Salut,

      J'ai l'impression que tu te compliques l'existence pour pas grand chose.
      Si tu veux faire du traitement d'image, il existe le module PIL.Image.

      Bonne continuation.
      • Partager sur Facebook
      • Partager sur Twitter
        16 novembre 2010 à 14:18:56

        Merci,
        mais c'est dans l'optique de cours que l'on doit faire ça, ils ont dis qu'on pouvait se débrouiller pour trouver les solutions à nos problèmes, c'est donc ce que je fais car on ne nous explique nullement ça en cours. On doit juste établir notre code SANS module extérieur... en fait on doit créer nous-même un module de traitement d'image...

        Quelqu'un pour m'aider? ^^

        Edit : mon code est correct, c'est juste le format de l'image qui bug... seulement j'obtiens ceci maintenant :
        ['P3\n', '# CREATOR: GIMP PNM Filter Version 1.1\n', '3 2\n', '255\n', '41\n', '55\n', '61\n', '38\n', '47\n', '47\n', '67\n', '71\n', '65\n', '61\n', '62\n', '57\n', '98\n', '94\n', '85\n', '64\n', '63\n', '58\n']

        Comment enlever les \n? et ensuite, j'explique le reste : P3 = format ASCII, celui qu'il faut. le deuxième élément indique avec quoi ça a été créer. le troisème, c'est longeur fois largeur je pense, c'est le format en pixels. le 4ème, la profondeur je pense (255) et ensuite, c'est les pixels... comment je crée une matrice avec ça? Merci de m'aider =)
        • Partager sur Facebook
        • Partager sur Twitter
        « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
          16 novembre 2010 à 19:00:12

          Aux temps pour moi.

          En fait, quand tu vas lire un fichier avec la méthode readline le type de donnée renvoyé est string, ou alors une liste de string pour readlines.

          Si tu veux une liste de liste, je pense qu'il va falloir coder une fonction toi même.
          Comment doit être affichée ta matrice? Veux-tu les 3 composantes par cellule ou une composante par cellule?
          En somme, je te demande plus de précision.

          J'ai fait queqlques tests sommaires de mon coté, pour sauvegarder une image, tu peux t'inspirer de ceci (sauf que je n'applique pas de traitement):
          def copie(ent, sor):
              source = open(ent, 'r')
              dest   = open(sor, 'w')
              
              for ligne in source:
                  dest.write(ligne)
              
              source.close()
              dest.close()
          
          
          if __name__=="__main__":
              copie("image_b.ppm","copie.b.ppm")
          


          Mon script fonctionne aussi bien pour des fichier binaires que pour des fichiers ASCII.
          • Partager sur Facebook
          • Partager sur Twitter
            16 novembre 2010 à 19:11:03

            Oui, mais en fait je dois définir une fonction qui ouvre l'image en tant que matrice. J'obtiens une simple liste avec readlines, et je ne dois m'occuper que des éléments contenu de readlines après le 255.

            Pour une image de 4*2, je devrais obtenir par exemple :
            P3 ==> type de l'image
            4 2 ==> taille
            29 ==> profondeur.
            0 0 0 1 2 3 2 2 2 3 6 4
            4 4 4 10 10 10 20 29 20 20 20 20

            et manipuler la matrice comme ceci :
            [0 0 0] [1 2 3] [2 2 2] [3 6 4]
            [4 4 4] [10 10 10[ [20 29 20] [20 20 20]

            comment j'obtiens un truc du genre?

            Edit : apparament, je devrais obtenir ceci
            [P3, # CREATOR: GIMP PNM Filter Version 1.1\n, [4,2], 29 , [[[0],[0],[0]],[[1],[2],[3]],[[2],[2,[2]],[[3],[6],[4]]
            ,[[[4],[4],[4]],[[10],[10],[10]],[[20],[29][20]],[[20],[20],[20]]]
            ... comment je fais? Merci =)
            • Partager sur Facebook
            • Partager sur Twitter
            « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
              16 novembre 2010 à 20:24:09

              Un truc à peu près dans ce genre :

              def affiche(fichier):
                  source = open(fichier, 'r')
              
                  #Extraction des paramètres hauteur-largeur:
                  dim = list(source)[2][:-1].split()
                  largeur=int(dim[0])
                  hauteur=int(dim[1])
                  
                  source.seek(0)  #Retour du curseur à la position 0
                  
                  tab = []
                  for cptr, ligne in enumerate(source):
                      if cptr<4:
                          print ligne
                      else:
                          for c in ligne:
                              tab.append(ord(c))
                          
                          matrice = [tab[i:i+3] for i in range(0, len(tab),3)]
                          matrice = [matrice[i:i+largeur] for i in range(0, len(matrice), largeur)]
                          
                          for k in matrice:
                              print k
              
              
              
              if __name__=="__main__":
                  affiche('image_b.ppm')
              


              Par contre, ça ne fonctionne que pour les fichiers binaires. Pour les fichiers ASCII, ce devrait être quelquechose de semblable.
              • Partager sur Facebook
              • Partager sur Twitter
                16 novembre 2010 à 20:33:12

                Je vais méditer sur ce code ^^ si j'arrive à quelque chose, je le dis, sinon je viens expliquer mon problème ^^

                Sinon, j'aurais un petit problème pour écrire une nouvelle image contenant les modifications, j'ai fait ceci :


                def creer_image(matrice,path):
                    matrice=str('matrice')
                    matrice.remove('[','')
                    matrice.remove(']','')
                    matrice.remove(',','')
                    open(path, 'wb').write(matrice)
                


                car une image n'est pas une liste, non? et maintenant, je n'ai plus besoin d'enlever les \n si je fais comme ça ^^ ça semble correct?
                • Partager sur Facebook
                • Partager sur Twitter
                « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
                  16 novembre 2010 à 20:36:57

                  Non. Je ne comprends pas trop ce que tu veux faire, mais la deuxième ligne est sûrement fausse.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 novembre 2010 à 20:49:49

                    Je dois partir d'une image de départ, lui appliquer des modifications, filtres, etc... la sortir en une autre image. Donc je prend la matrice obtenue par la modification, et je la sauve dans un fichier. mais seulement, je dois retirer les [ et ] ainsi que les virgules... avant de la sauver car à l'origine il n'y en a pas... donc je transforme en string et les retire du string. ça marche pas?

                    EDIT : compris pourquoi ma deuxième ligne marcherait pas... ça me renverrait jute matrice >.< je dois plutôt faire :matrice=str(matrice) non?

                    EDIT 2 : meilleur solution =
                    def creer_image(matrice,path):
                        matrice=join(matrice)
                        return open(path, 'wb').write(matrice)
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                    « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
                    Anonyme
                      16 novembre 2010 à 21:03:34

                      Si tu dois sauver une liste, tu sauvegardes donc un objet, tu peux utiliser le module pickle

                      Citation

                      mais seulement, je dois retirer les [ et ] ainsi que les virgules



                      On utilise ".join()

                      Enfin c'est le peut que j'ai compris. Pour un exercice de ce type, je pense qu'un peu plus de détails (ce que tu peux utiliser, ce que tu ne peux pas, etc...) .

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 novembre 2010 à 21:07:59

                        Ce que je peux utiliser : python sans module. Les listes, strings, etc... mais pas de dictionnaire ni de tuples.

                        Voilà, je pense que c'est tout. J'ai aussi utiliser le join finalement =) et ça retire aussi les virgules donc c'est nickel ^^ plus qu'à réussir à former la matrice comme je le veux ^^'

                        EDIT : le code affiche ci-dessus me retourne quelque chose rien à voir =/ help ^^'

                        Il faut que j'isole chaque donnée comme ceci :
                        [P3, # CREATOR: GIMP PNM Filter Version 1.1\n, [4,2], 29 ,
                        [[[0],[0],[0]],[[1],[2],[3]],[[2],[2,[2]],[[3],[6],[4]], lignes 1
                        [[[4],[4],[4]],[[10],[10],[10]],[[20],[29][20]],[[20],[20],[20]]] ligne 2

                        il s'agit d'une matrice 2 lignes, 4 colonnes... donc quand je lirai, j'aurai matrice[ligne][colonne] je pense bien ^^

                        Comment je fais? je pense faire un split contenant les 3 valeurs (j'aurais tous les pixels de chaque coordonnées en liste), et ensuite je fais des split également pour déterminer les lignes et les colonnes, mais je vois pas du tout comment faire ça =/


                        EDIT 2 : je touche au but mais j'ai une erreur (list index out of range)... voici mon code :

                        def test(path):
                            fichier=open(str(path),"r")
                            matrice=fichier.readlines()
                            taille=len(matrice)
                            dim=matrice[2].split()
                            largeur=int(dim[0])
                            hauteur=int(dim[1])
                            image=map(list,[[[[0]]*3]*largeur]*hauteur) #on initialise une image noir de même taille
                            print image
                            l=3
                            for i in range(hauteur+1):
                                for j in range(largeur):
                                    for k in range(3):
                                        image[i][j][k]=int(matrice[3+i+j]) #On remplace l'image par noire
                                        #par l'ancienne image.
                                        
                            print image
                        


                        On s'enfou un peu des prints, c'est pour voir si ça fait bien son boulot =) Quelqu'un voit mon erreur? plz >.<
                        • Partager sur Facebook
                        • Partager sur Twitter
                        « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
                          18 novembre 2010 à 23:37:15

                          Salut.

                          Ligne 11 de ton script :
                          #Remplace
                              for i in range(hauteur+1):
                          #par
                              for i in range(hauteur):
                          


                          Autrement, ta manière de créer ta liste image ne me permet pas de lui assigner des valeurs ultérieurement (ce n'est pas la première fois que je constate ce fait).
                          J'ai dû passer par une list-comprehension pour tester:
                          image = [[[ 0 for x in range(3)] for y in range(largeur)] for z in range(hauteur)]
                          


                          Au passage, je suis sous Python 2.6, et toi?

                          EDIT : Pour que ta matrice soit restituée correctement, il faudra remplacer la ligne 14 par:
                          offset = 4
                          image[i][j][k]=int(matrice[offset+k+3*(j+largeur*i)])
                          


                          Bonne continuation.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 novembre 2010 à 23:35:22

                            bonsoir j'ai testé les différents codes avec une petite image que j'ai crée avec gimp et j'ai des résultats assez étonnant et différent
                            def affiche(fichier):
                                source = open(fichier, 'r')
                            
                                #Extraction des paramètres hauteur-largeur:
                                dim = list(source)[2][:-1].split()
                                largeur=int(dim[0])
                                hauteur=int(dim[1])
                                
                                source.seek(0)  #Retour du curseur à la position 0
                                
                                tab = []
                                for cptr, ligne in enumerate(source):
                                    if cptr<4:
                                        print ligne
                                    else:
                                        for c in ligne:
                                            tab.append(ord(c))
                                        
                                        matrice = [tab[i:i+3] for i in range(0, len(tab),3)]
                                        matrice = [matrice[i:i+largeur] for i in range(0, len(matrice), largeur)]
                                        
                                        for k in matrice:
                                            print k
                            
                            
                            
                            if __name__=="__main__":
                                affiche('imageppm.ppm')
                            


                            j'ai le programme qui se lance à l'infini, il ne s'arrête pas et retape sans cesse les mêmes valeurs
                            avec le suivant j'obtiens
                            def ouvrir(path):
                                image=open(path,"r")
                                matrice=image.readlines()
                                print matrice
                                return matrice
                                
                            
                            ouvrir('./imageppm.ppm')
                            

                            ça me semble correct, faut enlever les \n
                            voici mon image que j'ai hébergé, elle est pas compliqué c'est pour faciliter les choses:
                            http://up.sur-la-toile.com/sG2G]imageppm.ppm
                            l'étape suivante est d'implémenter des rotations et de symétrie
                            je pense que le premier code est le + correct mais je trouve pas la ligne qui fait que ça s'exécute à l'infini
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 novembre 2010 à 3:23:42

                              Salut,

                              Pour moi, il affiche un grand nombre de fois les mêmes valeurs, c'est vrai. Mais c'est le cas uniquement lorsque j'analyse une image en mode ASCII.

                              J'ai bien précisé dans mon post que ce script est conçu pour les images au format binaire (Pourquoi? Parce que mes premiers tests ont été réalisés ainsi. Parce que je n'avais probablement pas compris, une fois de plus, que le sieur ne travaillait pas avec un format de fichier binaire).

                              Je donnais juste une piste pour traiter les images au format ASCII en donnant comme exemple une façon de traiter une image au format binaire.

                              Au cas où, je le reprécise car je ne l'ai pas fait suffisamment tôt, je suis sous Python 2.6.

                              Bon week-end.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 novembre 2010 à 10:29:26

                                C'est bon maintenant je pense, j'arrive à bien placer ça sous forme de matrice et même à gérer d'autres trucs. Il ne me reste qu'à définir deux fonctions et j'ai fini.

                                Merci pour tout

                                EDIT : J'ai maintenant un problème pour enregistrer la nouvelle image...

                                Par exemple, j'obtiens un truc du genre : ['P3', '# CREATOR: GIMP PNM Filter Version 1.1\n', '15 10', 255, [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [230, 253, 223], [180, 250, 159], [180, 250, 159], [230, 253, 223], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [180, 250, 159], [82, 243, 32], [82, 243, 32], [180, 250, 159], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [253, 223, 223], [250, 159, 159], [250, 159, 159], [253, 223, 223], [223, 241, 253], [159, 212, 250], [159, 212, 250], [223, 241, 253], [180, 250, 159], [82, 243, 32], [82, 243, 32], [180, 250, 159], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [250, 159, 159], [243, 32, 32], [243, 32, 32], [250, 159, 159], [159, 212, 250], [32, 156, 243], [32, 156, 243], [159, 212, 250], [230, 253, 223], [180, 250, 159], [180, 250, 159], [230, 253, 223], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [250, 159, 159], [243, 32, 32], [243, 32, 32], [250, 159, 159], [159, 212, 250], [32, 156, 243], [32, 156, 243], [159, 212, 250], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [253, 223, 223], [250, 159, 159], [250, 159, 159], [253, 223, 223], [223, 241, 253], [159, 212, 250], [159, 212, 250], [223, 241, 253], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]], [[255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255], [255, 255, 255]]] mais comment j'enregistre ça dans un fichier? je dois l'enregistrer en supprimant les , et []. ça me met une erreur Nonetype ou des trucs du genre avec join =/ comment faire? merci =)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
                                  21 novembre 2010 à 11:50:49

                                  Salut,

                                  Tu as essayé d'ouvrir avec un éditeur de texte ton fichier *.ppm ASCII pour voir à quoi il ressemble?
                                  Essaie de t'en inspirer.

                                  Il suffit de placer un élément de ta liste par ligne dans ton fichier de sortie.
                                  Et si ces éléments ont des sous-éléments, ce sont les sous éléments qu'il faut placer.
                                  Et si les sous éléments ont des sous-sous éléments, ce sont les sous-sous éléments qu'il faut placer.
                                  Etc...

                                  Sans oublier que certains sous-...-sous éléments sont des entiers.

                                  Bonne journée.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 novembre 2010 à 11:55:19

                                    C'est bon, maintenant j'y arrive =) mais il me reste à faire des symétrie verticale et des rotations de 90° dans les deux sens... là j'ai un problème avec mon code =/
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    « Il ne faut vouloir ni enjoliver ni excuser le christianisme : Il a mené une guerre à mort contre ce type supérieur de l'homme, il a mis au ban tous les instincts fondamentaux de ce type, il a distillé de ces instincts le mal, le méchant : — l'homme fort, type du réprouvé. » - Nietzsche
                                      21 novembre 2010 à 11:59:55

                                      Ok.

                                      Il y a déjà 2 sujets d'ouverts concernant la rotation et la symétrie.
                                      Viens nous rejoindre sur l'un d'eux.

                                      Si c'est bon pour le présent sujet, penses à mettre sur résolu.

                                      Bonne journée.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Traitement d'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