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

Programmation multimédia/Jeux Python Discussion :

Traitement d'image Python2.7


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Traitement d'image Python2.7
    Bonjour tous le monde, d'abords bon 1er Mai à tous les travailleurs (es);

    Ce petit code en PJ que j'ai fais en Python2.7, permet de detecter et dessiner les contours de mon image(jusque là ça marche bien)
    maintenant je souhaite par une boucle while (ou autre) extraire les coordonnées de contour par contour et les sauvegarder dans un fichier .txt

    le probleme que je rencontre est "je pense" dans la boucle, ou la condition d'extraction "je ne sais pas"!!!
    la question: comment je peux parcourir mon image, et extraire ces coordonnées, puis les enregistrer dans un fichier .Txt
    en séparant chanque données de contours par un commentaire, genre données contours 1 sont: ....etc jusqu'à faire tous les contours.
    Si vous avez une idée, merci de me la communiquer, je vous serai très reconnaissante!
    je suis bloquée depuis plus d'une semaine
    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
    41
    import matplotlib.pyplot as plt
    import numpy as np
    from PIL import Image
    import cv2
     
     
     
    im = cv2.imread ('m.jpg')
    imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    ret,thresh = cv2.threshold(imgray,200,255,0)
    contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    ''' cv2.CHAIN_APPROX_SIMPLE cette function renvoie que les points extraimes, et supprime tous les
    autres points... '''
    cnt = len(contours)
    print 'nombre de contours est: ', cnt
     
    '''
             pixel list
             '''
    nb_repetitions = cnt
    i = 0
    while i<=  nb_repetitions:
        cnts = contours[i]
        print 'cnts= ', cnts
        cv2.drawContours(im, [cnts], 0, (0,255,0), 3) #dessiner contour
        cv2.imshow ('affichage',im)
        cv2.waitKey (0)
        cv2.destroyAllWindows ()
        fichier = open("data.txt", 'w')
        fichier.write("coordonnees des contours extraits sont: \n\n")
        fichier.write("coordonnées des contours: \n")
        for x in range(len(im)): #parcourir les lignes
            for y in range(len(im[x])): #parcours des colonnes pour chaques lignes
                #if cnts[x][y] == : probleme je sais pas quelle condition dois je mettre
                    fichier.write("\n" +repr((x ,y)))
        i = i+1  #boucle             
    fichier.close()
     
    if i > nb_repetitions:
        print "ERROR! i > nb_repetitions '_°"
        raw_input("Appuyer sur ENTER pour terminer le programme. ")
    et voici l'image

    Nom : dilation.jpg
Affichages : 463
Taille : 30,4 Ko

    Merci d'avance!!

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    Salut ( je viens juste de repondre à ton MP pour info),

    En lisant ta demande, cela me fait penser à un post auquel j'ai participé il y a peu. Même exercice? Le post est ICI

    Apres pour le probleme de determiner les differentes formes, même repopnses, deux solutions principales:
    1-Il existe un algo dans OpenCV pour ce faire, et c'est cool (la doc est tres etoffer et trouver une info precise dedans n'est pas toujours aisé; peut etre le findcontour et/ou derive)
    2-Créer ton propre algo de detection
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu as déjà les coordonnées de tes contours dans contours, pourquoi parcoure-tu l'image dans une boucle et que veux-tu comparer avec les coordonnées pixels et contours.

    Ce sont déjà des coordonnées en pixels.

    Le problème est que leur mise en forme par openCV n'est pas des plus maniables, on peut y remédier ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    shapes = [(i[0][0][0], i[0][0][1], i[2][0][0], i[2][0][1]) for i in contours]
     
    shapes = sorted(shapes, key= lambda i: i[0]+i[1])
    with open("data.txt", 'w') as outf:
        for shape in shapes:
            outf.write("Coordonnées des contours: %s\n" % str(shape))
    Ce qui produira ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Coordonnées des contours: (65, 67, 281, 169)
    Coordonnées des contours: (59, 234, 286, 330)
    Coordonnées des contours: (54, 383, 227, 907)
    Coordonnées des contours: (370, 71, 503, 207)
    Coordonnées des contours: (317, 234, 770, 330)
    Coordonnées des contours: (283, 386, 438, 902)
    Coordonnées des contours: (607, 66, 761, 199)
    Coordonnées des contours: (797, 67, 941, 331)
    Coordonnées des contours: (511, 387, 660, 897)
    Coordonnées des contours: (729, 389, 927, 897)
    Par contre, je n'ai pas compris ce que tu veux avec "coordonnees des contours extraits sont:"

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    salut et merci,

    coordonnées contours extrait n'est qu'un commentaire qui sera affiché dans l'entete du fichier .txt...


    je comprend pas!!

    j'ai juste copié ce que tu as fais pour extraire les données!
    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
    41
     
    import matplotlib.pyplot as plt
    import numpy as np
    from PIL import Image
    import cv2
     
     
     
    im = cv2.imread ('i.jpg')
    imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    ret,thresh = cv2.threshold(imgray,200,255,0)
    contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    ''' cv2.CHAIN_APPROX_SIMPLE cette function renvoie que les points extraimes, et supprime tous les
    autres points... '''
    cnt = len(contours)
    print 'nombre de contours est: ', cnt
     
    '''
             pixel list
             '''
    nb_repetitions = 1
    i = 0
    while i<=  nb_repetitions:
        cnts = contours[i]
        cv2.drawContours(im, [cnts], 0, (0,255,0), 3) #dessiner contour
        cv2.imshow ('affichage',im)
        cv2.waitKey (0)
        cv2.destroyAllWindows ()
     
        fichier = open("data.txt", 'w')
        shapes = [(i[0][0][0], i[0][0][1], i[2][0][0], i[2][0][1]) for i in contours]
        shapes = sorted(shapes, key= lambda i: i[0]+i[1])
        with open("data.txt", 'w') as outf:
            for shape in shapes:
                outf.write("Coordonnées des contours: %s\n" % str(shape))
    i = i+1
    fichier.close()
     
    if i > nb_repetitions:
        print "ERROR! i > nb_repetitions '_°"
        raw_input("Appuyer sur ENTER pour terminer le programme. ")
    maintenant, avec ton code, l'éxécution me renvoie une erreur que je comprend pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:/Python27/Programme Essais/Traitement_d_image/resolu.py", line 23, in <module>
        while i<=  nb_repetitions:
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Meuuh non, hein, tu ne dois pas mettre cela dans la boucle.

    Pourquoi copier six fois de suite le fichier, mets ça avant la boucle par exemple.

    Le message d'erreur provient sans doute du fait que ta boucle utilise "i" pour l'itération et la list comprehension utilise aussi la lettre "i".


    Edit: ton "i = i+1" n'est pas bien indenté.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    oui oui , c'est bon j'ai le meme résultat que toi!
    en faite j'ai pas compris le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Coordonnées des contours: (65, 67, 281, 169)
    Coordonnées des contours: (59, 234, 286, 330)
    Coordonnées des contours: (54, 383, 227, 907)
    Coordonnées des contours: (370, 71, 503, 207)
    Coordonnées des contours: (317, 234, 770, 330)
    Coordonnées des contours: (283, 386, 438, 902)
    Coordonnées des contours: (607, 66, 761, 199)
    Coordonnées des contours: (797, 67, 941, 331)
    Coordonnées des contours: (511, 387, 660, 897)
    Coordonnées des contours: (729, 389, 927, 897)
    pour quoi quatres coordonnées?? je souhaite extraire que les (x,y) des pixels

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Les deux premières désignent le coin supérieur gauche du rectangle et les deux autres le coin diamétralement opposé.

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci bien


    Bonne journée

+ 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