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 :

Premiers pas dans python


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut Premiers pas dans python
    Salut à tous,

    Je débute dans python, et après avoir un petit peu fait le tour du langage au niveau écrit, j'ai quelques problèmes pour avancer plus loin.

    Je m'explique, j'ai besoin de la librairie PIL, et je suis sous mac os x, et je n'ai pas réussi à l'importer, ou du moins convenablement.

    J'ai besoin d'une fonction dans cette librairie qui me permettera de compter les pixels en fonction de leurs couleurs... Il y a quelque chose qui me permettera de faire ça?

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    tu peux faire:
    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
    from PIL import Image
     
    im = Image.open("monImage.jpg")
     
    pixels = {}
     
    x, y = im.size
     
    for i in range(x):
        for j in range(y):
            pixel = im.getpixel((i, j))
            v = pixels.setdefault(pixel, 0)
            pixels[pixel] = v + 1
     
    for k, v in pixels.iteritems():
        print k, ":", v

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Un grand merci pacificator, je vais essayer ça...

    Au fait j'ai trouvé pour installer la librairie PIL sous mac os x, si ça peut servir à quelqu'un un jour je le dit ici.

    Il faut aller ici http://pythonmac.org/packages/py24-fat/index.html

    Télécharger le package PIL, l'installer et hop...

    Comme éditeur j'utilise "Komodo Edit" c'est vraiment top.

    Et pour lancer mes script "pythonlauncher" compris dans l'install de python.

    Avec tout ça je suis paré pour programmer en pyhon sous mon mac.

    Et je vais tester tout de suite ton script.

    +++

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Ah oké, j'ai plus ou moins compris ce que fait ton programme...

    Mais en fait, il faudrait pouvoir isoler les taches de pixels de couleurs similaires... C'est ces taches qui m'intéressent...

    Par exemple j'ai 3 taches de vert et 6 taches de noir... tu vois?

    Et les taches trop petites ne m'intérèssent pas, ou du moins pour le moment...

    Enfin je vais essayer de voir ce que je peux faire, mais si tu, ou vous tous, avez qques idées, elles sont les bienvenues...

    +++

    (nb: ta boucle met pas mal de temps, mon processeur serait en cause? 400 mhz?)

  5. #5
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    le problème se corse d'un coup...

    Il faut se poser deux questions:
    1) Qu'est-ce qu'une tâche (forme, taille minimale)
    2) Qu'est-ce qu'une couleur similaire (couleur exactement identique ou presque identique)

    Concernant le temps de traitement, un processeur de 400MHz est effectivement lent, et le programme balaye tous les pixels, un à un, c'est long, surtout si l'image est de taille consequente.

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Re,

    Les taches en question seront de forme arrondies, et de taille variable...

    Pour le moment de 3 a 5 millimètres environ...
    Le couleur seront presque identique, dans les même nuance de vert par exemple.

    Ici sur cette photo par exemple



    5 vert et 3 noirs... U see?

    Je m'était dit qu'en partant de ton code, je pourrai dire que si je me retrouve avec plusieurs pixels de la même couleur (ou presque identique) je pourrai considérer que c'est une tache non? L'idéal serait de l'avoir de haut en bas aussi, mais ça c'est un peu plus chaud...

    Merci pour ton aide en tout cas

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Si tes images sont toutes comme ceci (un fond uniforme, des taches bien définies et par de superposition), c'est pas trop difficile.

    Pour récupérer l'ensemble de tes tâches, un simple seuillage (en niveau de gris fera l'affaire).

    Voici un code très crade (y'a surement une fonction de seuillage tout faite ou bien passer par numpy).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import Image
     
    im = Image.open('dsc00001fd5.jpg').convert('L')
    imp = im.load()
    for i in range(im.size[0]):
        for j in range(im.size[1]):
            imp[i,j] = (imp[i,j]>100) * 255
     
    im.save('toto.png')
    Après une fois l'image des taches récupérées, tu récupères chaque tâche couleur (c'est pas trop dur), tu peux alors calculer la couleur moyenne de tes taches couleur et en déduire à quelle catégorie de tâches elles appartiennent.

  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Salut à tous,

    Pacificator, tu saurais m'expliquer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    v = pixels.setdefault(pixel, 0)
            pixels[pixel] = v + 1
    Et a quoi sert ton Enfin si tu veux bien ...

    Et guigui j'ai testé ton morceau de programme mais voilà ce qu'il me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    line 7, in ?
        imp[i,j] = (imp[i,j]>100) * 255
    TypeError: unsubscriptable object
    Bizarre... non?

    Merci et à +

  9. #9
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    salut,
    pixels est un dictionnaire (table de hashage) contenant le nombre d'occurence par couleur.
    Les couleurs, representées par un tuple (n-uplet) de couleurs (R, G, B), sont les clés du dictionnaires.

    La méthode setdefault(cle, valeur) des dictionnaires permet de renvoyer la valeur associée à une clé, si cette clé n'existe pas, elle l'initialise avec la valeur par défaut; cela evite une boucle du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if pixels.has_key(pixel):
        v = pixels[pixel]
    else
        v = 0
    Il suffit alors d'incrementer la valeur associée à la couleur chaque fois qu'elle est trouvéeJ'aurais du nommer ma variable couleur au lieu de pixel.

    Le pixels.iteritems() permet de parcourir les elements du dictionnaire en renvoyant des tuples de deux elements (cle ,valeur).

    Je ne saurais trop te conseiller de parcourir l'aide en ligne de python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> pixels = {}
    >>> help(pixels.setdefault)
    Help on built-in function setdefault:
     
    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
     
    >>> help(pixels.iteritems)
    Help on built-in function iteritems:
     
    iteritems(...)
        D.iteritems() -> an iterator over the (key, value) items of D
     
    >>>
    Bon python

  10. #10
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    le module ImageEnhance peut repondre à ton besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import Image
    import ImageEnhance
    im = Image.open('dsc00001fd5.jpg')
    bright = ImageEnhance.Brightness(im)
    im2 = bright.enhance(3)
    im2.show()

  11. #11
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par thance
    Et guigui j'ai testé ton morceau de programme mais voilà ce qu'il me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    line 7, in ?
        imp[i,j] = (imp[i,j]>100) * 255
    TypeError: unsubscriptable object
    Bizarre... non?

    Merci et à +
    Tu as bien la version 1.1.6 installée ?
    => http://python.developpez.com/cours/p.../php/image.php (explication du côté de la fonction load)

  12. #12
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Dis moi ton projet ne serait pas dans la branche capture du mouvement, ou création de volume par rapport a une image 2D?

    Si c'est le cas je te souhaites du courage dans un futur proche.

    Soit, si tu veux un bout de code pour faire un seuillage assez rapide avec numpy et PIL (seuillage rapide utile pour grande quantité d'image)

    Va voir ici

    Si ta des soucis de compréhension ... n'ésite pas. D'ailleur d'autre fonction te seront surment utiles si ton application devient 'Moins Théorique' comme avec un bruit de fond tout bete... a moins si tu prends tes photos à a peu pret 0 Kelvin... (Erosion dilatation)

    Au Fait GUIGUI_ je vais essayer de trouver un instant pour finir vraiment ce tuto qu'il puiss etre disponible a tous.

    Cordialement Francois Louis.

  13. #13
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Salut à tous!

    Alors dans l'odre :
    -merci pour l'explication pacificator
    -je ne sais pas pour la version, mais pour le moment, je vais voir sans... parceque je ne comprends pas trop...
    -"Dis moi ton projet ne serait pas dans la branche capture du mouvement, ou création de volume par rapport a une image 2D?" : heuu non, pas pour le moment, si il ya mouvement ça ne sera que la detection.

    Alors voilà ou j'en suis pour le moment : j'analyse pixel par pixel, et si c'est en dessous d'un certain seuil, foncé en l'occurence, je réécris ce pixel dans une image "neuve", bon c'est assez simple, mais je commence hein.
    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
    from PIL import Image
     
    im = Image.open("/Users/thomashance/Desktop/tfe/prog/DSC00001.JPG")##.convert('L')
    seuil = (125,125,125)
    ##rangreen = (
    rangecolor= (10,10,10)
    pixels = {}
    compt=0
    k=0
    img = Image.new('RGB', im.size, color=(255,255,255))
     
    x, y = im.size
    ## fais la collecte de tous les pixels avec leur couleurs respectives
    for i in range(x):
        for j in range(y):
            pixel = im.getpixel((i, j))
            ##v = pixels.setdefault(pixel, 0)
            ##pixels[pixel] = v + 1 
            if pixel[1] <= seuil[1] and pixel[2] <= seuil[2] and pixel[0] <= seuil[0]:
                print im.getpixel((i, j))
                img.putpixel(((i, j)), pixel)
     
    print compt
    img.show()
    Alors maintenant, je vais considérer plusieurs pixels de suite dans le même range, et si oui, je compte... Si non je continue... et compt = 0, et donc plus de tache... on verra bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ##if ((pixel[0] - rangecolor[0]),(pixel[1] - rangecolor[1]),(pixel[2] - rangecolor[2])) <= k <= ((pixel[0] + rangecolor[0]),(pixel[1] + rangecolor[1]),(pixel[2] + rangecolor[2])):
    ##  compt = compt + 1
    ##else:
    ##  compt = 0
    En fait ça n'ira pas, je m'en rends compte en le tapant, vous avez d'autres idées?
    Puis, selon l'indice de couleur, c'est plutôt noir ou, plutôt vert?

    Voilà...

  14. #14
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Ah pas mal ton truc enhance pacificator, ça fait presque la même chose!

    Je vais voir ce qu'il ya moyen de faire avec...

    ++

  15. #15
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par parp1
    Va voir ici

    Si ta des soucis de compréhension ... n'ésite pas. D'ailleur d'autre fonction te seront surment utiles si ton application devient 'Moins Théorique' comme avec un bruit de fond tout bete... a moins si tu prends tes photos à a peu pret 0 Kelvin... (Erosion dilatation)

    Au Fait GUIGUI_ je vais essayer de trouver un instant pour finir vraiment ce tuto qu'il puiss etre disponible a tous.

    Cordialement Francois Louis.
    Merci pour le lien, c'est vraiment pas mal, et je comprends plus ou moins, mais il n'explique pas concrètement à quoi sert l'érosion et la dilatation... j'en aurais p-e besoin?

    Les photos seront plus tard avec plus de parasites... Donc il faudra l'adapter..

    ++

    (désolé de ces réponses en petit morceaux )

  16. #16
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    En fait, au lieu d'une boucle pixel par pixel, je pourrais faire un carré de pixels qui se déplace, et que quand il rencontre qq chose ou il rentre totalement dedans, tout ces pixels sont dans le même range, hop, compter plus 1, j'ai juste? Je vais essayer de faire ça...

    ++

  17. #17
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    J'ai encore trouvé autre chose, mais ça marche...

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #! /usr/bin/env python
    ##colors = len(filter(None, im.histogram()))
     
    ##print colors
     
    from PIL import Image
     
    im = Image.open("/Users/thomashance/Desktop/tfe/prog/DSC00001.JPG")##.convert('L')
    seuil = (125,125,125)
    ##rangreen = (
    rangecolor= (10,10,10)
    pixels = {}
    compt={}
    k=0
    s=0
    img = Image.new('RGB', im.size, color=(255,255,255))
     
    x, y = im.size
    ## fais la collecte de tous les pixels avec leur couleurs respectives
    for i in range(x):
        for j in range(y):
            pixel = im.getpixel((i, j))
            ##v = pixels.setdefault(pixel, 0)
            ##pixels[pixel] = v + 1 
            if pixel[1] <= seuil[1] and pixel[2] <= seuil[2] and pixel[0] <= seuil[0]:
                ##print im.getpixel((i, j))
                img.putpixel(((i, j)), pixel)
                compt[j+i]= 1
     
    for i in compt.iteritems():
        if i[0]!=(s+1):
            k=k+1
            s=i[0]
        else:
            s=i[0]
     
     
    print "nombre de taches: "
    print k +1
    img.show()
    Vous en pensez quoi?

    ++

  18. #18
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Bon ben finalement c'est vraiment pas du tout précis, j'ai un peu perdu mon temps...

    Je vais devoir faire comme suit je pense :

    Au lieu de sonder pixels par pixels, je vais faire avancer dans l'image un rond (virtuel car il s'agira de deux lignes s'entrecoupant) et si ce rond a tous ces pixels dans le même range de couleur, on peu le compter, et récupérer ses données.

    Donc voilà, la théorie est la, mais dans la pratique comment je fais défiler un point avec des boucles... en faisant plusieurs boucles l'une après l'autre?

    Enfin, voilà, si vous avez des pistes...

    Merci

  19. #19
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Moi je vais juste te donner un conseil.... Créer un nouveau post. Parce que le sujet a bien changé. C'est plus trop des questions de débutants.

    Je pense que certaines personne zap ton post car ils n'ont pas envie de parler de chose que l'ont acquiert au debut.Pourtant il faut bien que vous commenciez afin que l'ont puisse vous aidez.

    Donc un conseil Créer un nouveau post et pourquoi pas avec [Traitement D'image] comme tag??? Et la tu verras que des personnes qui ne s'était pas encore interessé au sujet se reveillerons.

    Parlons de ton sujet : "En gros tu veux trouver les points dans ton images?" Et rassembler les pixels formant ces points? C'est bien Cela?

  20. #20
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par parp1
    Parlons de ton sujet : "En gros tu veux trouver les points dans ton images?" Et rassembler les pixels formant ces points? C'est bien Cela?
    Je vais suivre ton conseil! Je ferai ça se soir si j'ai le temps...

    Alors, mon sujet : détecter des zones de pixels (amas de pixels de forme arrondie et de taille équivalente), et les compter, et dissocier les couleurs.

    En fait je pensais que j'étais toujours au stade débutant, c'est pour ça que j'ai continué, mais tu me flattes en disant que je suis plus avancé que ça...



    Aller a plus

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Premiers pas dans SWING
    Par hpl76 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 30/08/2007, 12h59
  2. Premier pas dans Linux
    Par ouedro dans le forum Distributions
    Réponses: 7
    Dernier message: 14/03/2007, 17h02
  3. premiers pas dans Python - palindrome
    Par tarang dans le forum Général Python
    Réponses: 1
    Dernier message: 31/10/2006, 16h56
  4. premier pas dans la vie active
    Par godik dans le forum Emploi
    Réponses: 12
    Dernier message: 10/10/2005, 16h27

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