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 :

Pixeliser une image avec la library PIL


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Alimentation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Par défaut Pixeliser une image avec la library PIL
    Bonjour, je suis débutant en python et je cherche en vain depuis plusieurs heures à pixeliser une image avec la libraire PIL..

    Je m'explique, imaginons que j'ai une image en niveau de gris de 300x300, j'aimerai la pixeliser avec des pixels de taille 10x10.

    J'ai très bien compris le principe:

    - On traite un premier bloc de 10x10 pixels de la première image, on prend la moyenne des valeurs de ces pixels

    - On donne cette nouvelle valeur (la moyenne) aux 10x10 pixels de l’image initiale

    - On passe ensuite au second bloc, et on opère de même etc... Jusqu’à avoir fini tout les blocs

    Mais je n'arrive pas à l'interpreter en python..

    J'espère avoir été assez clair.. Si quelqu'un pouvait m'aider, je lui en serai très reconnaissant.

    Merci d'avance!

    Voila le "début" du programme:

    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
     
    def moyenne(pix):
        numberOfData = len(larg)*len(haut)
        moyenne = 0
        for i in range(len(pix)):
            for data in pix[i]:
                moyenne += data/numberOfData
        return moyenne
     
    #--------------------------------------
     
    from PIL import Image
    import webbrowser
     
    im=Image.open('turing_gris.jpg')
    im2=Image.new('F',(300,300))
    pix=im.load()
    pix2=im2.load()
    larg, haut=im.size
     
    for i in range(larg//10):
        for j in range(haut//10):
            for k in range(10):
            	for l in range(10):
                     p=im.getpixel((j*10+l , i*10+k))
                     im2=im.putpixel((i,j),p)
     
    im2.save('turing_gris2.jpg')
    webbrowser.open('turing_gris2.jpg')
    J'ai essayé de créer une fonction moyenne, je ne sais pas si elle marche et je ne sais pas non plus comment l'implanter...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Relisez la recette de cuisine que vous avez donnée:
    Citation Envoyé par takeamic Voir le message
    J'ai très bien compris le principe:

    - On traite un premier bloc de 10x10 pixels de la première image, on prend la moyenne des valeurs de ces pixels

    - On donne cette nouvelle valeur (la moyenne) aux 10x10 pixels de l’image initiale

    - On passe ensuite au second bloc, et on opère de même etc... Jusqu’à avoir fini tout les blocs
    est-ce que vous retrouvez ces étapes dans votre code?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Alimentation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Par défaut
    - On traite un premier bloc de 10x10 pixels de la première image
    - On donne cette nouvelle valeur (la moyenne) aux 10x10 pixels de l’image initiale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in range(larg//10):
        for j in range(haut//10):
            moyenne=[calculer la moyenne ici]
            [donner la valeur de la moyenne au 10x10 pixels]
    Justement le problème est là, je n'arrive pas du tout à interpréter cette "recette" en python.
    J'y ai passé plusieurs sans trouver la démarche à effectuer, il faudrait que l'on m'explique clairement comment y arriver...

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    tes boucles for ne sont pas bonnes, quand on parle d'un bloc de 10x10 pixels, ça veut dire que n'importe où qu'on se place (x;y), on veut traiter tous les pixels dans le bloc qui va de (x;y) à (x+10;y+10), toi ce que tu fais c'est que tu divises la largeur par 10 (et idem pour la hauteur dans l'autre boucle), les choses doivent avoir du sens

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Alimentation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Par défaut
    C'est à dire ainsi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in range(larg):
        for j in range(haut):
            for k in range(larg+10):
            	for l in range(haut+10):

  6. #6
    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
    Un conseil, tu prends une petite image et tu mets des "print" pour voir ce que tu parcours.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par takeamic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in range(larg//10):
        for j in range(haut//10):
            moyenne=[calculer la moyenne ici]
            [donner la valeur de la moyenne au 10x10 pixels]
    Justement le problème est là, je n'arrive pas du tout à interpréter cette "recette" en python.
    J'y ai passé plusieurs sans trouver la démarche à effectuer, il faudrait que l'on m'explique clairement comment y arriver...
    Pour l'instant vous devez batailler pour maîtriser les boucles.
    C'est une activité que vous devez réaliser avec la console Python avec des petits tests comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> H = L = 30
    >>> for i in range(H//10):
    ...     for j in range(L//10):
    ...         print((i, j), end=' ')
    ...
    Pour voir comment se comportent i et j.
    Et aussi parce que vous avez le "help" qui vous permet d'avoir une idée de ce que font les builtins/primitives comme range:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class range(object)
     |  range(stop) -> range object
     |  range(start, stop[, step]) -> range object
     |
     |  Return a virtual sequence of numbers from start to stop by step.
    et accessoirement de vous familiariser avec l'anglais technique.
    note: relisez le "step" et essayer de trouver comment faire une boucle de 10 en 10.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Aide] Faire apparaître une image avec PIL
    Par Tytin dans le forum Général Python
    Réponses: 21
    Dernier message: 26/05/2013, 12h25
  2. [PIL] redimensionner une image avec resize
    Par nicolivier dans le forum Général Python
    Réponses: 12
    Dernier message: 06/04/2013, 17h20
  3. Afficher une image avec PIL
    Par laurent25 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 17/10/2008, 12h42
  4. Afficher une image avec PIL
    Par O_connor dans le forum Tkinter
    Réponses: 3
    Dernier message: 12/04/2007, 14h39
  5. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58

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