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 :

Traitement d'image : Négatif


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut Traitement d'image : Négatif
    Bonjour, mon objectif est de mettre une image qui est en noir et blanc en négatif. Je sais que pour cela il faut modifier la valeur des pixels en faisant 255-la valeur des pixels.
    Mon problème est que je ne sais pas comment modifier la valeur des pixels de l'image, car je n'ai pas encore vue en cours la méthode PIL, existe-t-il un autre moyen pour récupérer la valeur des pixels ?

    Voici ce que j'ai fais pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fichier=open("souris_p2.pgm","w")
    fichier.write("P2 \n") #le nombre magique
    fichier.write("15 15 \n") #nombre de ligne et de colonne
    fichier.write("255 \n") #intervalle de couleur
     
    for ligne in range(0,16): 
        for colonne in range(0, 16):
            fichier.write(str(255-"valeur_du_pixel") + ' ')
        fichier.write("\n")
     
    fichier.close

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par reborn1234 Voir le message
    existe-t-il un autre moyen pour récupérer la valeur des pixels ?
    Les valeurs des pixels de quelle image ? Une que tu génères toi-même ou une image quelconque ?
    Si c'est pour celle de ton dégradé, le négatif sera le dégradé inverse

    Si c'est une image que tu n'as pas créée toi-même, ça va être un poil plus complexe, car il faudra déterminer si c'est un fichier binaire ou texte simple (P2, P5), récupérer les dimensions de l'image et travailler avec. L'avantage du binaire sera qu'il n'y aura pas de conversion de type à faire pour calculer le négatif.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Salut.

    Les valeurs des pixels de quelle image ? Une que tu génères toi-même ou une image quelconque ?
    Si c'est pour celle de ton dégradé, le négatif sera le dégradé inverse

    Si c'est une image que tu n'as pas créée toi-même, ça va être un poil plus complexe, car il faudra déterminer si c'est un fichier binaire ou texte simple (P2, P5), récupérer les dimensions de l'image et travailler avec. L'avantage du binaire sera qu'il n'y aura pas de conversion de type à faire pour calculer le négatif.
    Cette fois-ci c'est avec un fichier image au format PGM que j'ai télécharger et que je dois modifier (c'est une photo d'une souris en noir et blanc)
    Quand j'ouvre l'image avec Python j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P2
    600 400
    255
    #et ensuite il y a les valeurs de chaque pixels
    Donc c'est un texte simple vue qu'il y a P2, et les dimensions ce serait 600 pixels de largeurs et 400 de hauteurs c'est ça ?

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Oui, donc, c'est du simple texte.

    Il va donc falloir ouvrir ce fichier en lecture et convertir les valeurs des pixels en entiers (c'est le plus gros du morceau).

    Donc déjà, charge ce fichier en lecture et utilise fichier.readlines() afin d'obtenir une liste des lignes du fichier, à toi de regarder ce que ça contient et identifier à partir de quel indice commence la ligne des pixels. Ensuite tu devras jouer avec str.split pour construire la liste des pixels, que tu devras parcourir ensuite afin de les convertir en eniers et appliquer le négatif.

    Voilà en gros ce qu'il faut faire, t'as du boulot ^^

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Ensuite tu devras jouer avec str.split pour construire la liste des pixels, que tu devras parcourir ensuite afin de les convertir en eniers et appliquer le négatif.
    Je ne comprend pas trop comment je dois construire la liste de pixels avec split
    Pour le reste voici ce que j'ai maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fichier=open("souris_p2.pgm","r") #ouverture du fichier en mode lecture
     
    lignes_fichier = fichier.readlines() #liste des lignes du fichier
     
    fichier.close()
     
    print(lignes_fichier[3]) #l'élément de rang 3 de la liste correspond à la 1ere ligne
                             #de pixels
     
    ligne1_de_pixel=lignes_fichier[3] #ligne1 est assigné à la première ligne de pixels
     
    ligne1_de_pixel.split #construire la liste de pixels
    Jusque là c'est bon ?

  6. #6
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par reborn1234 Voir le message
    Je ne comprend pas trop comment je dois construire la liste de pixels avec split
    Oui, désolé, j'étais encore resté sur ton précédent script de dégradé où tu avais plusieurs valeurs par ligne. Normalement la norme est d'avoir une valeur par ligne, ce qui facilite encore plus la tâche.

    Pour ouvrir ton fichier, et enregistrer les lignes dans une liste, le mieux est de faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open('souris_p2.pgm') as f :
        lignes_fichier = [line for line in f if line[0] != '#']
    Cela permet de ne pas stocker dans la liste les lignes d'éventuels commentaires du fichier.

    Tu as saisi comment récupérer les valeurs d'entête du fichier, et tu sais comment parcourir une liste, donc à partir de là, il est simple du'tiliser un range commencant à telle valeur, et pour son point d'arrêt, soit tu t'appuies sur la largeur × hauteur + point de départ, ou soit la longueur de la liste, ou encore plus simple en utilisant un slice sur la liste lignes_fichier[indice_de_depart_des_pixels:] et parcourir ces éléments.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Salut.
    Tu as saisi comment récupérer les valeurs d'entête du fichier, et tu sais comment parcourir une liste, donc à partir de là, il est simple du'tiliser un range commencant à telle valeur, et pour son point d'arrêt, soit tu t'appuies sur la largeur × hauteur + point de départ, ou soit la longueur de la liste, ou encore plus simple en utilisant un slice sur la liste lignes_fichier[indice_de_depart_des_pixels:] et parcourir ces éléments.
    Salut, je n'ai pas tout compris ce que je dois faire dans le range,
    Je commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for a in range (0,600*400+lignes_fichier[0]):
    C'est ça ?
    Et est ce que c'est normal que lorsque je fais print(lignes_fichier) il n'y a que des valeurs comprises entre en 0 et 251 qui augmentent au fur et à mesure ?

  8. #8
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par reborn1234 Voir le message
    Salut, je n'ai pas tout compris ce que je dois faire dans le range,
    Je commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for a in range (0,600*400+lignes_fichier[0]):
    Pourquoi lignes_fichier[0] ?
    Les pixels ne commencent pas à la ligne 0, mais la ligne 3, donc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for a in range (3, 600*400 + 3)
    Mais comme dit, utiliser la longueur de la liste suffit, ton script devrait en gros se résumer à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with open('souris_p2.pgm') as f :
        lignes = [l for l in f if l[0] != '#']
     
    # Les pixels commencent au 3ème élément des lignes
    for i in range(3, len(lignes)) :
        pixel = 255 - int(lignes[i])
        lignes[i] = str(pixel) + '\n'
     
    with open('souris_p2_negatif.pgm', 'w') as f :
        f.write(''.join(lignes))
    Si les pixels du fichier ne sont pas mis « ligne à ligne », alors décris un peu comment il est composé, nombre de lignes, colonnes.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Pourquoi lignes_fichier[0] ?
    Les pixels ne commencent pas à la ligne 0, mais la ligne 3, donc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for a in range (3, 600*400 + 3)
    Ah oui mince j'ai cru que les lignes avant les pixels avaient disparu

    Mais comme dit, utiliser la longueur de la liste suffit, ton script devrait en gros se résumer à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with open('souris_p2.pgm') as f :
        lignes = [l for l in f if l[0] != '#']
     
    # Les pixels commencent au 3ème élément des lignes
    for i in range(3, len(lignes)) :
        pixel = 255 - int(lignes[i])
        lignes[i] = str(pixel) + '\n'
     
    with open('souris_p2_negatif.pgm', 'w') as f :
        f.write(''.join(lignes))
    Lorsque j'éxécute le programme il y a une erreur ça m'affiche "TypeError : unsupported operand type -:'int' and 'str'", c'est au niveau de la ligne 6 avec pixel=...
    Et "join" je suppose que ça permet de joindre mais pourquoi est ce qu'on l'utilise ? On ne peut pas faire ça ?

  10. #10
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par reborn1234 Voir le message
    Lorsque j'éxécute le programme il y a une erreur ça m'affiche "TypeError : unsupported operand type -:'int' and 'str'", c'est au niveau de la ligne 6 avec pixel=...
    Lorsqu'on a ce genre d'erreurs, il faut contrôler ce que contient la variable avec un simple print et/ou une exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in range(3, len(lignes)) :
        try :
            pixel = 255 - int(lignes[i])
        except TypeError :
            print(lignes[i])
            raise SystemExit()
        lignes[i] = str(pixel) + '\n'
    Il serait bien que tu montres un peu ce que contient ton fichier, les 10 premières lignes devraient suffire.

    Citation Envoyé par reborn1234 Voir le message
    Et "join" je suppose que ça permet de joindre mais pourquoi est ce qu'on l'utilise ? On ne peut pas faire ça ?
    C'est une base du langage à connaître.

    https://python.developpez.com/cours/...ge_12#L12-A-13

    Et non, on ne peut pas écrire une liste avec write, mais avec writelines si.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Lorsqu'on a ce genre d'erreurs, il faut contrôler ce que contient la variable avec un simple print et/ou une exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in range(3, len(lignes)) :
        try :
            pixel = 255 - int(lignes[i])
        except TypeError :
            print(lignes[i])
            raise SystemExit()
        lignes[i] = str(pixel) + '\n'
    Mais ça fait quoi le except car on pouvait faire print(ligne[i]) sans le except non ?

    Il serait bien que tu montres un peu ce que contient ton fichier, les 10 premières lignes devraient suffire.
    D'accord mais comme il y a 600*400 valeurs ça fais un peu gros pour que je fasse un copier coller du fichier même pour les premières lignes vue qu'il y a 400 valeurs par lignes...Et je n'arrive pas à joindre le fichier, je vous met donc tout en bas une partie du fichier lorsqu'on l'ouvre avec python (il y a les 20 premières lignes ça doit suffire je pense)
    Fichiers attachés Fichiers attachés

  12. #12
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par reborn1234 Voir le message
    Mais ça fait quoi le except car on pouvait faire print(ligne[i]) sans le except non ?
    Il sert à attraper l'erreur, et vu qu'il n"y a aucun intérêt à continuer le programme alors on lève une exception SystemExit qui l'interrompra.

    Citation Envoyé par reborn1234 Voir le message
    D'accord mais comme il y a 600*400 valeurs
    Bah voilà, je m'en doutais un peu, mais sans confirmation, c'est pour cela que je t'avais demandé si'il y avait un pixel par ligne.

    Sachant cela, alors il faut s'adapter.

    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
     
    with open('souris_p2.pgm') as f :
        lignes = [l for l in f if l[0] != '#']
     
    entete = lignes[0:3]
    pixels = []
     
    # Parcours de la liste des lignes de pixels
    for ligne in range(3, len(lignes)) :
        # Récupération de la liste des pixels de la ligne
        liste_pixels = lignes[ligne].split()
        for pixel in liste_pixels:
            pixel = 255 - int(pixel.strip())
            pixels.append(str(pixel) + '\n')
     
    with open('souris_p2.pgm', 'w') as f :
        f.writelines(entete)
        f.writelines(pixels)
    Je n'ai pas testé, mais normalement cela devrait fonctionner, et il n'y aura plus plusieurs pixels par lignes dans le fichier de destination, mais un seul, il est beaucoup plus simple de travailler sur un fichier avec ce format.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Je n'ai pas testé, mais normalement cela devrait fonctionner, et il n'y aura plus plusieurs pixels par lignes dans le fichier de destination, mais un seul, il est beaucoup plus simple de travailler sur un fichier avec ce format.
    il y a une erreur : AttributeError 'int' object has no attribute 'split' à la ligne 11 , il faut que je fasse print(lignes) pour comprendre où est l'erreur ?
    Et "pixel.strip" quand je cherche sur internet on me dit que ça "enlève les espaces éventuels au début et à la fin de la chaîne", une chaîne c'est une liste ?

  14. #14
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Citation Envoyé par reborn1234 Voir le message
    il y a une erreur : AttributeError 'int' object has no attribute 'split' à la ligne 11 , il faut que je fasse print(lignes) pour comprendre où est l'erreur ?
    Oups désolé, if fallait écrire liste_pixels = lignes[ligne].split().
    J'ai corrigé le code.
    Mais là y avait même par à faire de print, en lisant le code l'erreur était flagrante.

    Citation Envoyé par reborn1234 Voir le message
    Et "pixel.strip" quand je cherche sur internet on me dit que ça "enlève les espaces éventuels au début et à la fin de la chaîne", une chaîne c'est une liste ?
    Non ce n'est pas une liste, il y a des choses que l'on peut faire sur une liste aussi bien que sur une chaîne, mais c'est tout, les deux sont complètement différents.

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 26
    Par défaut
    Oui cela fonctionne maintenant, merci beaucoup encore un topic résolu
    Juste, quelle est la différence lorsqu'on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with open('nom_du_fichier') as f
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f=open('nom_du_fichier','r')
    ça permet juste de ne pas avoir à faire ?

  16. #16
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    En gros, oui.

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

Discussions similaires

  1. Traitement d'images : quel langage?
    Par belasri dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/10/2005, 09h59
  2. Réponses: 5
    Dernier message: 15/01/2005, 18h29
  3. commande c++ pour le traitement d'images
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2005, 10h46
  4. [lib] Traitement d'images
    Par Gogoye dans le forum Multimédia
    Réponses: 4
    Dernier message: 19/11/2004, 16h15
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

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