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

Calcul scientifique Python Discussion :

[NumPy] Problème à propos d'un exercice sur image binaire


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut [NumPy] Problème à propos d'un exercice sur image binaire
    Bonjour,

    Je suis élève de terminale S. Ayant pris la spécialité ISN, je suis chargé pour le bac d'un projet à propos du traitement d'images. Une partie de ce projet concerne les images binaires avec des procédés tels que l'érosion, la dilatation, l'ouverture, la fermeture etc.. Le but final du projet est de pouvoir compter les balles sur une image en utilisant d'abord l'érosion (à plusieurs reprises) pour distinguer précisément les balles, puis en créant un programme qui récupère le tableau de valeurs de l'image binaire et à partir de celui-ci compte les balles. Voici d'abord le résultat de l'érosion (cinq érosions consécutives effectuées) :

    Nom : Image1bis.jpg
Affichages : 441
Taille : 48,2 Ko

    Nom : balles.jpg
Affichages : 402
Taille : 20,3 Ko

    Ce tableau est celui associé à l'image érodée : (c'est en fait un simple tableau avec des 0 et des 1 ayant les mêmes dimensions que l'image)

    Nom : Capture.JPG
Affichages : 393
Taille : 17,1 Ko

    Ensuite, il me reste à compter chaque balle, c'est à dire (en fait) chaque ensemble de "1". J'ai d'abord considéré qu'un ensemble de "1" était un groupe dans lequel, si on prend un pixel, on trouve un autre pixel à 1 soit à gauche ou à droite, soit en haut ou en bas.

    Mon idée est d'examiner les pixels et si on trouve un pixel étant à 1, on l'efface (affectation de la valeur 0) et on fait pareil tant qu'on trouve des pixels voisins (soit du même groupe) étant aussi à 1. Cette boucle permettra d'effacer un groupe entier, et une fois celui-ci effacé, on incrémente le compteur. On recommence l'opération jusqu'à ce que chaque groupe de pixels à 1 (soit chaque balle) soit effacé.

    J'ai donc créé les fonctions suivantes :

    Nom : code.JPG
Affichages : 451
Taille : 67,8 Ko

    La variable a contient le tableau de valeurs que j'ai mis un peu plus haut.

    Pourtant, quand j'exécute le programme, je trouve un nombre improbable du style 35 000. Je ne vois pas où est mon erreur. Est-ce que quelqu'un pourrait m'aider ?

    Merci d'avance.
    i.Polo
    Images attachées Images attachées  

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    On n'a pas tout ton code. On ne sait pas ce que c'est l'objet img, le premier argument de nb_objects. Mais je dirais attention aux indices des tableaux numpy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import numpy as np
    >>> a = np.arange(9).reshape(-1, 3)
    >>> a
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    >>> a[:][1]
    array([3, 4, 5])
    >>> a[:, 1]
    array([1, 4, 7])
    >>>

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Salut,

    img est en fait l'image de base (celle non érodée). Ensuite la fonction DistinctionBalles érode l'image comme sur la deuxième photo et le tableau qui en résulte est stockée sous la variable 'a'.

    Je n'ai pas énormément de connaissances dans les tableaux NumPy alors je n'ai pas compris ce que tu appelles les indices.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    C'est vrai qu'on ne fait pas ça au lycée. Les indices permettent de repérer les éléments d'un tableau. Ton tableau tab2d est construit à partir d'une image, il y a 2 dimensions. Chaque élément du tableau est déterminé par 2 indices, notés i et j.
    Ce que je trouve suspect, c'est la notation tab2d[i][j]. Pour désigner l'élément d'un tableau numpy correspondant à la position i du premier indice et j du second, on utilise la notation tab2d[i, j].

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Ah oui d'accord, c'est en quelque sorte les coordonnées. Je voix ce que tu veux dire, mais j'ai essayé de changer et de mettre toutes les coordonnées comme tu m'as dit et je trouve toujours le même résultat.

    Est ce que les deux fonctions que j'ai créées sont correctes hormis peut-être les indices?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Si tu veux voir mon code pour obtenir le tableau :

    Nom : Capture.JPG
Affichages : 425
Taille : 40,1 Ko

    J'ai changé mon programme, je pars directement de l'emplacement de la nouvelle image érodée :

    Nom : prog.JPG
Affichages : 392
Taille : 11,2 Ko

    Voilà.

    (oublie la ligne de passage en niveaux de gris, je l'utilisais pour d'autres images)

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    C'est parce que les tests dans erase_object sont mal définis.

    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
    # -*- coding: utf-8 -*-
     
    import numpy as np
    import matplotlib.pyplot as plt
     
    def erase_object(tab2d, i, j):
        tab2d[i, j] = 0
        nr, nc = tab2d.shape
        for s1, s2 in ((-1, 0), (1, 0), (0, -1), (0, 1)):
            i1, i2 = i + s1, j + s2
            if 0 <= i1 < nr and 0 <= i2 < nc and tab2d[i1, i2]:
                erase_object(tab2d, i1, i2)
     
    def nb_object(img):
        tab2d = img
        counter = 0
        for i in range(tab2d.shape[0]):
            for j in range(tab2d.shape[1]):
                if tab2d[i][j] == 1:
                    erase_object(tab2d, i, j)
                    counter += 1
        return counter
     
    if __name__ == '__main__':
        arr = np.zeros((10, 10))
        arr[1:3, :2] = 1
        arr[1, 9:] = 1
        arr[4:9, 4:9] = 1
        arr[5, 3] = 1
        arr[3, 5] = 1
     
        plt.imshow(arr, interpolation='none')
        plt.show()
     
        print(nb_object(arr))
    Nom : test_3_zones.png
Affichages : 401
Taille : 7,4 Ko
    Je retrouve bien 3 zones.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Le problème venait effectivement de la condition, et aussi de la profondeur de la pile sur Python. C'est bon, je trouve bien 14 balles, merci pour ton aide

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par __dardanos__ Voir le message
    Chaque élément du tableau est déterminé par 2 indices, notés i et j.
    Ce que je trouve suspect, c'est la notation tab2d[i][j]. Pour désigner l'élément d'un tableau numpy correspondant à la position i du premier indice et j du second, on utilise la notation tab2d[i, j].
    C'est équivalent.
    Pas d'aide par mp.

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

Discussions similaires

  1. Problème à propos d'un exercice
    Par Kopp92i dans le forum Général Python
    Réponses: 3
    Dernier message: 04/11/2013, 03h23
  2. problème affichage de none--exercice sur les classes--swinnen
    Par kalice dans le forum Général Python
    Réponses: 2
    Dernier message: 09/03/2013, 15h07
  3. ouverture morphologique sur image binaire
    Par mayssaMM dans le forum Images
    Réponses: 5
    Dernier message: 17/05/2011, 12h17
  4. Problème d'espace avec lien sur image
    Par kanabzh29 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 07/06/2009, 13h56
  5. Problème d'affichage de metadata sur image dicom
    Par pedrozo-81 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/03/2007, 12h22

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