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 : faire un dégradé


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 : faire un dégradé
    Bonjour,
    Je souhaiterais obtenir un fichier au format PGM d'un dégradé basique (juste en noir et blanc verticalement), je ne vois pas du tout comment faire... Pouvez vous me donner un indice s'il vous plaît ? L'image que je souhaiterais obtenir est ci dessous

    Pièce jointe 450837

    Mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fichier=open('traitement.pbm','w')
    fichier.write('P2\n')
    fichier.write('# Une diagonale\n')
    fichier.write('11 11\n')
     
    nbligne=11
     
    for ligne in range(nbligne):
        for i in range(ligne):
            fichier.write(str(i-255)+" '')
     
    fichier.close

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 153
    Par défaut
    Possiblement avec PIL comme ceci ?

  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
    Merci de votre réponse, mais j'aimerais si possible ne pas utiliser la méthode "import quelque chose" parceque je n'ai pas encore appris ça en cours

    J'ai vue que l’intervalle utilisé pour coder chacune des nuances de gris est dans mon cas un nombre entier entre 0 et 255.
    Donc j'ai essayé de modifier ligne par ligne mon image en mettant la 1ere ligne à 255 puis je diminue cette valeur pour chaque ligne suivante jusqu'à la dernière ligne que je met à 0 (donc blanc ?)
    Mais quand je fais ça je n'arrive pas à ouvrir le fichier pour voir si ça à marché, ça m'affiche "erreur durant la lecture du fichier "
    Je ne vois pas ce qu'il faut modifier pour que je puisse ouvrir le fichier ou si mon code est faux

    Voici mon code (j'ai essayé avec 2 lignes pour voir si cela marchait) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    fichier=open("le dégradé.pgm","w") #format pgm
    fichier.write("P2 \n") #le nombre magique
    fichier.write("2 2 \n") #nombre de ligne et de colonne
    fichier.write("255 \n") #intervalle de couleur
     
    for ligne in range(1,2):
        if ligne==1:
            fichier.write(str(255)+" ") #ligne 1 en noir
        if ligne==2:
            fichier.write(str(0)+" ") #ligne 2 en blanc
        fichier.write("\n")
     
    fichier.close()

  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
    Salut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in range(1,2):
       # ...
    ligne ne vaudra jamais 2, ne pas oublier que le stop du range est non inclus.

    Citation Envoyé par reborn1234 Voir le message
    Mais quand je fais ça je n'arrive pas à ouvrir le fichier pour voir si ça à marché, ça m'affiche "erreur durant la lecture du fichier "
    Je ne vois pas ce qu'il faut modifier pour que je puisse ouvrir le fichier ou si mon code est faux
    Un fichier pgm peut s'ouvrir avec un simple éditeur de texte. En modifiant donc ton range, on obtient.

    P2
    2 2
    255
    255
    0
    Qui avec un visionneur d'images affiche une image de 2px de côté, ce qu'est censé faire ton code.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in range(1,2):
       # ...
    ligne ne vaudra jamais 2, ne pas oublier que le stop du range est non inclus.

    Ah oui c'est vrai j'avais oublier que la dernière valeur du range n'était pas incluse !
    Donc j'ai changé la dernière valeur je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in range(1,3):
    #...
    Et j'obtiens bien :
    P2
    2 2
    255
    255
    0
    Mais j'ai toujours le même problème lorsque je souhaite visionner l'image ( je l'ouvre avec le logiciel Xnview qui peut : Ouvrir, Éditer, Créer, et Imprimer les fichiers .PGM) et le message d'erreur s'affiche "erreur durant la lecture du fichier"...

    Je pense que cela vient de mon code car lorsque je fait du code pour un fichier PBM j'arrive à l'ouvrir
    Je ne sais pas ce qu'il faut modifier

  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
    Citation Envoyé par reborn1234 Voir le message
    Mais j'ai toujours le même problème lorsque je souhaite visionner l'image ( je l'ouvre avec le logiciel Xnview qui peut : Ouvrir, Éditer, Créer, et Imprimer les fichiers .PGM) et le message d'erreur s'affiche "erreur durant la lecture du fichier"...
    Le visionneur d'image de mon système est plus tolérant et s'accomode mieux que Xnview que je ne connais pas.

    Indice :
    - Combien de pixels devrait-il y avoir dans une image de 2 × 2 ?
    - Combien de pixels crées-tu ?

  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
    Indice :
    - Combien de pixels devrait-il y avoir dans une image de 2 × 2 ?
    Une image de 2 x 2 devrait avoir 4 pixels ?

    - Combien de pixels crées-tu ?
    Je ne sais pas comment connaître le nombre de pixel de mon image, je vois sur internet qu'on peut utiliser la méthode "getpixel" mais il faut importer quelque chose pour ça mais à l'intuition je dirais aussi 4 pixels vue qu'il y a 2 colonnes et 2 lignes

  8. #8
    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
    J'ai trouvé mon erreur je crois !
    J'ai codé en caractère BINAIRE et non ASCII
    Or pour un fichier PGM codé en BINAIRE le "nombre magique" est P5
    Et c'est pour un fichier PGM codé en ASCII que le nombre magique est P2

    Il me reste juste un mini problème : est ce que je dois donc changer les valeurs de mon intervalle de couleur ? Car j'obtiens du noir et du gris plutôt proche du noir et non du noir et du blanc, j'ai donc une erreur dans mes valeurs ? Pourtant je croyais que 0 et 255 étaient le blanc et le noir ?

  9. #9
    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
    J'ai trouvé mon erreur je crois !
    J'ai codé en caractère BINAIRE et non ASCII
    Or pour un fichier PGM codé en BINAIRE le "nombre magique" est P5
    Et c'est pour un fichier PGM codé en ASCII que le nombre magique est P2

    En quoi ton fichier est codé en binaires ? Soit tu ne nous as pas tout dit, soit il y a quiproquo.
    Et je doute que tu t'en sortes mieux avec du binaire que de l'ASCII

    https://fr.wikipedia.org/wiki/Portable_pixmap#PGM

  10. #10
    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

    En quoi ton fichier est codé en binaires ? Soit tu ne nous as pas tout dit, soit il y a quiproquo.
    Et je doute que tu t'en sortes mieux avec du binaire que de l'ASCII

    https://fr.wikipedia.org/wiki/Portable_pixmap#PGM
    En fait j'ai essayé avec P5 à la place de P2 et j'ai vu que ça marchait donc j'ai pensé que je faisais du binaire ...
    Et j'ai essayé d'ajouter une 3eme ligne en lui faisant prendre la valeur 100 (j'ai pris cette valeur au pif) pour faire un dégradé noir-gris-blanc et ça ne fais pas du tout ce que j’espérais

    Voici mon code
    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
    fichier=open("le dégradé.pgm","w") #format pgm
    fichier.write("P5 \n") #le nombre magique
    fichier.write("3 3 \n") #nombre de ligne et de colonne
    fichier.write("255 \n") #intervalle de couleur
     
    for ligne in range(1,4):
        if ligne==1:
            fichier.write(str(255)+" ") #ligne 1 en noir
        if ligne==2:
            fichier.write(str(100)+" ") #ligne 2 en gris
        if ligne==3:
            fichier.write(str(0)+" ") #ligne 3 en blanc
        fichier.write("\n")
     
    fichier.close()

  11. #11
    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
    Il n'y a toujours que 3 pixels dans ton image de 3px × 3px.
    De plus n'utilises pas de P5 qui a pour principal avantage d'être plus léger en poids, mais sera totalement illisible.

    Si.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data = ['P2', '100 104', '255']
    pixels = []
     
    for i in range(0, 256, 5): # 52 tours
        ligne = ' '.join([str(i)] * 100)
        pixels.insert(0, ligne)
        pixels.append(ligne)
     
    data.extend(pixels)
     
    with open('degrade.pgm', 'w') as f:
        f.write('\n'.join(data))
    Chez toi, génère toujours une image illisible par ton visionneur d'images, bah changes en...
    Parce que chez moi cette image ne pose aucun problème à être affichée avec un visionneur d'images ou manipulée avec un logiciel de retouches d'images (imageMagick et sa suite, gimp, etc.).

    D'ailleurs, si tu as un logiciel de création d'images, tu pourrais t'en inspirer pour voir comment est construit le fichier (bien choisir ascii lors de l'enrgistrement en pgm).

  12. #12
    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

    Chez toi, génère toujours une image illisible par ton visionneur d'images, bah changes en...
    Parce que chez moi cette image ne pose aucun problème à être affichée avec un visionneur d'images ou manipulée avec un logiciel de retouches d'images (imageMagick et sa suite, gimp, etc.).

    D'ailleurs, si tu as un logiciel de création d'images, tu pourrais t'en inspirer pour voir comment est construit le fichier (bien choisir ascii lors de l'enrgistrement en pgm).
    Merci beaucoup ça fonctionne , il y a plusieurs "mots" que je n'ai jamais utilisé mais je vais faire des recherches dessus,

    Mais juste une petite question, j'avais continué mon code pour essayer de faire un dégradé et j'ai réussi à en faire un on va dire mais ça fait vraiment dégradé "bas de gamme" on va dire... comment est ce que je pourrais l'améliorer pour faire un vrai dégradé ?
    Je vous met la photo de ce que j'obtiens :
    Nom : CaptureTHE dégradé.PNG
Affichages : 4816
Taille : 623 octets

    Et mon code :
    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
    fichier=open("THE dégradé.pgm","w") #format pgm
    fichier.write("P2 \n") #le nombre magique
    fichier.write("10 10 \n") #nombre de ligne et de colonne
    fichier.write("255 \n") #intervalle de couleur
     
    for ligne in range(1,11):
        for colonne in range(1,11):
            if ligne==1:
                fichier.write(str(255)+" ") #ligne 1 en blanc
            elif ligne==2:
                fichier.write(str(227)+" ") #enlever 28 à la valeur qu'on écrit dans le fichier
                                            #pour se rapprocher du noir petit à petit
            elif ligne==3:
                fichier.write(str(199)+" ")
            elif ligne==4:
                fichier.write(str(171)+" ")
            elif ligne==5:
                fichier.write(str(143)+" ")
            elif ligne==6:
                fichier.write(str(115)+" ")
            elif ligne==7:
                fichier.write(str(87)+" ")
            elif ligne==8:
                fichier.write(str(59)+" ")
            elif ligne==9:
                fichier.write(str(30)+" ")
            else:
                fichier.write(str(0)+" ") #ligne 10 en noir
        fichier.write("\n")
     
    fichier.close()

  13. #13
    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.

    C'est à toi de gérer ton dégradé en fonction de la hauteur de ton image. Il est évident qu'avec une image de 10px de haut, un échelonnement de 0 à 255 par pas de 27/28 va engendrer de forts contrastes. Pour obtenir quelque chose de plus chiadé avec la même dimension d'image, il faudrait partir d'un simple blanc ou noir vers un gris.

    Mais maintenant que tu arrives à créer une petite image, tu peux voir plus grand, et générer une image de 255 pixels de haut, ainsi tu pourrais utiliser un pas de 1 pour chaque incrémentation de valeur.

    Note, le range permet d'utiliser le pas d'incrémentation, il faut apprendre à s'en servir, car toutes ces conditions dans ta boucle sont inutiles et rendent ton code affreux.

    255, c'est 17 × 3 × 5, donc on a le choix parmi ces valeurs (ou produits parmi elles).

    Par exemple, pour 17

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> list(range(255, -1, -17))
    [255, 238, 221, 204, 187, 170, 153, 136, 119, 102, 85, 68, 51, 34, 17, 0]
    Soit 16 valeurs, donc on pourrait modifier ton code, afin d'obtenir une image de 16 × 16.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fichier=open("THE dégradé.pgm","w") #format pgm
    fichier.write("P2 \n") #le nombre magique
    fichier.write("16 16 \n") #nombre de ligne et de colonne
    fichier.write("255 \n") #intervalle de couleur
     
    for valeur in range(255, -1, -17):
        for colonne in range(0, 16):
            fichier.write(str(valeur) + ' ')
        fichier.write("\n")
     
    fichier.close()
    C'est quand même plus simple, ne trouves-tu pas ?

  14. #14
    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.

    Maintenant que tu arrives à créer une petite image, tu peux voir plus grand, et générer une image de 255 pixels de haut, ainsi tu pourrais utiliser un pas de 1 pour chaque incrémentation de valeur.

    Note, le range permet d'utiliser le pas d'incrémentation, il faut apprendre à s'en servir, car toutes ces conditions dans ta boucle sont inutiles et rendent ton code affreux.

    C'est quand même plus simple, ne trouves-tu pas ?
    Ah mais ouii ! Dire que la solution était juste devant moi et que je galérais à essayer de faire des boucles avec des "while" hier soir alors qu'il y avait tout simple

    Du coup j'ai essayé avec 255 lignes et 255 colonnes en retirant -1 à chaque fois ça marche très bien c'est beaucoup mieux, merci d'avoir pris le temps de m'aider c'est super sympa

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/07/2008, 20h42
  2. Comment faire du traitement d'images avec C?
    Par The-msx dans le forum C
    Réponses: 5
    Dernier message: 07/07/2008, 10h05
  3. [Traitement d'image] Comment faire un texte incrusté
    Par solorac dans le forum Webdesign & Ergonomie
    Réponses: 7
    Dernier message: 22/05/2008, 15h14
  4. Réponses: 1
    Dernier message: 15/05/2008, 20h11
  5. Réponses: 2
    Dernier message: 02/10/2006, 15h38

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