Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2935 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Programme de traitement image PGM binaire (tableau2D)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programme de traitement image PGM binaire (tableau2D)

n°2081358
Matematox
Posté le 08-06-2011 à 15:26:26  profilanswer
 

Bonjour à tous;
 
Je suis en première année de fac informatique, et pour ce deuxième semestre un projet de programmation en Python nous a été donné.
Il consiste en la réalisation d'un petit programme de traitement d'image PGM en binaire avec Tkinter, avec différents outils tels que la symétrie droite/gauche, ajout de bandes noires sur l'images, effet négatif ... et d'autres.
 
Mon projet est à rendre pour demain, et je suis bloqué, vraiment bloqué, au début. Autrement dit il nous faut pour traiter l'image, la passer sous un tableau2D... ce que je n'arrive pas du tout à faire malgré les différents fichiers disponibles pour nous aider.
La semaine prochaine sont mes partiels, je suis à fond dans mes révisions et ai du mal à me plonger dans la prog.  
Je sais que ce qu'on nous demande n'est pas très compliqué, mais j'avoue n'avoir pas vraiment suivis les différents TD concernant le projet et ai vite été largué.
Je ne pourrai pas faire de miracles pour demain, mais si quelqu'un, habile en Python, pouvait me donner un petit coup de pouce magique afin d'avancer un peu mon projet, je lui en serai très reconnaissant.
Je rappelle que je sais très bien que le forum n'est pas là pour pondre le travail de untel ou untel, je n'ai pas l'habitude de demander tant d'aide, mais je me sens dans la merde et ... voilà. :s
 
J'ai pour l'instant créé mon canevas, mon petit menu, ma fonction pour ouvrir une image et adapter le canevas, je bloque sur la fonction pour enregistrer l'image, et surtout pour passer cette image sous un tableau2D afin de la traiter.
 
Pour ça je vous donne ce que j'ai fait pour le moment, et vous transmet les fichiers fournis (type énoncés, modules...) par les enseignants.  
 
[Ici notre support de travail, contenant des "cours", énoncés, et autres fichiers] = http://dept-info.labri.fr/ENSEIGNE [...] pport.html
 
Dans mon programme, je dispose d'un :
 
main.py  

Code :
  1. from Tkinter import *
  2. from interface import *
  3. from pgm import *
  4. #On cree une fenetre
  5. fen = Tk()
  6. #image initialisee, on cree un caneva
  7. zone_image = {'cadre':None,'image':None}
  8. zone_image['cadre'] = Canvas(fen, height= 300, width = 300, background='black')
  9. zone_image['cadre'].bind("<Button-1>", pointeur)
  10. zone_image['cadre'].pack()
  11. #On cree le menu et l'ajoute
  12. mon_menu = Menu(fen)
  13. fen.config(menu=mon_menu)
  14. menu_fichier = Menu(mon_menu)
  15. mon_menu.add_cascade(label="Fichier", menu=menu_fichier)
  16. menu_fichier.add_command(label="Ouvrir...", command=lambda: ouvrireimage(zone_image))
  17. menu_fichier.add_command(label="Sauver sous...", command=lambda:sauverimage())
  18. menu_fichier.add_command(label="Quitter", command=lambda:fen.destroy())
  19. menu_traitement = Menu(mon_menu)
  20. mon_menu.add_cascade(label="Traitement d'image", menu=menu_traitement)
  21. menu_traitement.add_command(label="Symetrie droite/gauche", command=lambda:symetriedg())
  22. fen.mainloop()


 
interface.py (qui contient les callback)

Code :
  1. from Tkinter import *
  2. import tkFileDialog
  3. from interface import *
  4. from pgm import *
  5. from traitement import *
  6. def ouvrireimage(zone_image):
  7.     global image
  8.     global nom_image
  9.     zone_image['cadre'].delete(ALL)
  10.     nom_image = tkFileDialog.askopenfilename()
  11.     if nom_image != ():
  12.         afficherimage(zone_image)
  13. def afficherimage(zone_image):
  14.     zone_image['image'] = PhotoImage(file=nom_image)
  15.     zone_image['cadre'].create_image(0, 0, anchor=NW, image = zone_image['image'])
  16.     zone_image['cadre'].configure(height = zone_image['image'].height(), width = zone_image['image'].width())
  17. def pointeur (event):
  18.     x,y = event.x,event.y
  19.     print x,y
  20. def sauverimage():
  21.     nom_image = asksaveasfilename()
  22.     print(nom_fichier)


 
traitement.py (qui contient les fonctions de traitement d'image)

Code :
  1. Je n'ai donc pour l'instant rien dedans


 
J'ai aussi un fichier :
 
tableau2D.py (que je n'arrive pas à utiliser)

Code :
  1. # -*- coding:utf-8 -*-
  2. # création d'un vecteur taille l initialisé à val
  3. def creer_tableau_1D(l, val):
  4.     t = [val]*l 
  5.     return t
  6. # création d'une matrice [h,l] initialisée à val
  7. # le premier indice correspond à la hauteur
  8. def creer_tableau (h, l, val):
  9.     t = creer_tableau_1D(h, None)
  10.     for i in range(0, h):
  11.         t[i] = creer_tableau_1D(l, val)
  12.     return t
  13. # affichage sommaire
  14. def afficher_tableau(t):
  15.     print()
  16.     for i in range(len(t)):
  17.         print(t[i])
  18. #tests
  19. if __name__ == "__main__":
  20.     m = creer_tableau(10, 5, 0)
  21.     afficher_tableau(m)
  22.    
  23. # parcours ligne par ligne
  24. #     cpt = 0
  25. #     h = len(m)
  26. #     l = len(m[0])
  27. #     for i in range(h):
  28. #         for j in range(l):
  29. #             m[i][j] = cpt
  30. #         cpt += 1
  31. # parcours colonne par colonne
  32.     cpt = 0
  33.     h = len(m)
  34.     l = len(m[0])
  35.     for j in range(l):
  36.         for i in range(h):
  37.             m[i][j] = cpt
  38.         cpt += 1
  39.            
  40.     afficher_tableau(m)


 
et pgm.py

Code :
  1. # -*- coding:utf-8 -*-
  2. from tableaux2D import *
  3. from string import *
  4. # lecture/ecriture de fichier pgm binaire
  5. def creer_fichier(l,h,nom,type):
  6.     file = open(nom,'w')
  7.     file.write(type + '\n')
  8.     file.write(str(l) + ' ' + str(h) + '\n')
  9.     file.write('255 \n')
  10.     return file
  11. def creer_image_pgm_binaire(t, nom):
  12.     h = len(t)
  13.     l = len(t[0])
  14.     file =creer_fichier(l,h,nom,'P5')
  15.     for i in range(h):
  16.         for j in range(l):
  17.             file.write('%c'%t[i][j]) #transforme un entier entre 0 et 255 en octet
  18.     file.close()
  19. def lire_fichier_pgm_binaire (nom):
  20.     f = open (nom)
  21.   #lecture du "magic number" P5
  22.     mode = f.readline()
  23.  
  24.   #lecture des dimensions (il faut sauter les éventuelles lignes de commentaire)
  25.     dim = f.readline()
  26.     while dim[0] == '#':
  27.         dim = f.readline()
  28.     t_dim = split(dim)
  29.     largeur = int(t_dim[0])
  30.     hauteur = int(t_dim[1])
  31.   # création du tableau image
  32.     t_image = creer_tableau(hauteur, largeur, 0)
  33.   # lecture de la valeur maximale d'un niveau de gris (255)
  34.     val_max = f.readline()
  35.     for i in range(hauteur):
  36.         for j in range(largeur):
  37.             t_image[i][j] = ord(f.read(1)) # transforme un octet en entier
  38.     f.close()
  39.     return t_image


 
 
Voilà tout, en vous remerciant d'avance.
Matema


Message édité par Matematox le 09-06-2011 à 17:52:16
mood
Publicité
Posté le 08-06-2011 à 15:26:26  profilanswer
 

n°2081696
Matematox
Posté le 09-06-2011 à 21:30:29  profilanswer
 

Rebonsoir, j'ai jusqu'à demain pour mon projet, je vous re sollicite au cas ou quelqu'un passerai par là et pourrai m'aider :)
Merci

n°2081833
carrion cr​ow
Immortal until my death
Posté le 10-06-2011 à 12:34:08  profilanswer
 

Salut,

 

Je ne suis pas assez avancé en python pour pouvoir t'aider vraiment, mais je peux te donner quelques idées (je laisse le soin aux connaisseurs de me corriger si nécessaire  :) )

 

D'après ce que j'ai lu vite fait sur les docs du site que tu donne, une image pgm est un tableau de nombres séparés par des espaces, donc en gros un fichier texte enregistré en pgm.

 

Pour le passer en tableau 2D, je pense que tu dois lire ligne par ligne, utiliser la méthode .split pour transformer cette ligne en liste de nombres, et ensuite intégrer cette liste à une liste maîtresse (le tableau 2D). Tu dois bien sur dégager les infos sur la taille et les niveaux de gris du début de fichier.

 

Pour une image comme ça (un point blanc entouré de 8 pixels noir):

Code :
  1. 0 0 0
  2. 0 1 0
  3. 0 0 0
 

Ton tableau 2D devrait ressembler à ça:

Code :
  1. tableau2D = [[0, 0, 0],
  2.              [0, 1, 0],
  3.              [0, 0, 0]]
 

Pour enregistrer l'image, il faut créer un fichier, ou en ouvrir un, et inscrire sur deux lignes  sa taille, puis le niveau de gris et ensuite parcourir le tableau 2D et inscrire chaque sous liste sur une ligne différente.

 

Pour le négatif, tu prends chaque élément du tableau que tu soustrais de la valeur de niveaux de gris.

 

Voilà, si ça peut t'aider (j'espère ne pas avoir mis de conneries)


Message édité par carrion crow le 10-06-2011 à 12:35:05

---------------
Des piafs en photo
n°2082000
Matematox
Posté le 11-06-2011 à 21:37:56  profilanswer
 

Je te remercie pour ces explications :) Un ami m'a énormément aidé sur le projet dont j'ai du faire la soutenance vendredi matin...
Le programme est loin d'être terminé mais j'ai quelques jours pour le faire.  
 
Encore merci carrion crow de t'être penché sur mon sujet.
A bientôt !

n°2082837
carrion cr​ow
Immortal until my death
Posté le 16-06-2011 à 21:09:35  profilanswer
 

Salut,
 
Ça avance ?
 
Mets ton code, quand tu l'auras fini, ça m'intéresse


---------------
Des piafs en photo

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Programme de traitement image PGM binaire (tableau2D)

 

Sujets relatifs
tableau PHP multi dimenssion avec indice [RESOLU]insertion d'une image a l'aide du OrdImage en java
tableau de devis vtiger Pdf Makerrécupérer le nom d'une image dans un dossier
affichage d'un tableau AndroidAfficher une image avec header(..jpeg) et readfile en php
Probléme de tableau dans requete sqlPasser d'un entier à des bits
Plus de sujets relatifs à : Programme de traitement image PGM binaire (tableau2D)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR