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

Images Discussion :

Mesure d'un angle


Sujet :

Images

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Points : 11
    Points
    11
    Par défaut Mesure d'un angle
    Bonjour à tous,

    Je débute avec le traitement d'image et j'ai quelques difficultés à comprendre comment ça marche. Je vous explique ce que je veux faire et jusqu'où je suis allé (pas très loin...):

    J'ai une image que j'ai converti en noir et blanc. Cette image comporte des traits blancs de longueur variable à certains endroits de l'image. Il y a d'autres zones blanches mais ce sont uniquement les traits blancs qui m'intéressent.
    Ce que je souhaite en faire, c'est compte leur nombre et les isoler du reste en les mettant en évidence (par exemple, garder uniquement les traits en blanc et mettre toutes les autres régions en noir). Ensuite, l'objectif est que j'analyse l'angle que font ces lignes.

    Pour l'instant, mon code ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    I = imread('image.jpg');
    level = graythresh(I);
    BW = im2bw(I,level);
    imshow(BW)
     
    CC = bwconncomp(BW);
    STATS = regionprops(BW);
    Je découvre tout juste les fonctions bwconncomp et regionprops et j'imagine que ce sont celles que je dois utiliser. Néanmoins, l'aide de Matlab n'est pas très fournie à ce sujet.
    L'objectif est que j'arrive à sélectionner les régions qui m'intéressent à l'aide de différents paramètres (disons par exemple leur aire), pour effacer les autres (les colorer en noir?).
    Ensuite, je souhaite calculer l'angle que fait mon trait et j'ai cru voir qu'il y avait une fonction orientation qui pourrait m'aider pour cela avec regionprops. Cependant je ne sais pas comment elle s'utilise.

    J'espère que je suis assez clair.
    Merci d'avance pour votre aide!

  2. #2
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Salut,

    Si les zones que tu souhaites colorier en noir sont d'aire (= nb de pixels) bien supérieures à celle de tes traits, alors tu peux avec regionprops, sélectionner ces zones et leur affecter la valeur 0. (Il faut que tu utilises l'option 'Area' pour ça)

    Ensuite, pour obtenir les angles, tu peux en effet utiliser l'option 'Orientation'. Ca te donnera les angles par rapport à l'horizontale. Puis, un petit calcul arithmétique te permettra de trouver l'angle entre chacun de tes éléments.

    J'espère qu'avec ça tu vas pouvoir avancer !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour ta réponse!

    Je me doutais effectivement que c'était quelque chose du genre. Ce qui me pose problème est peut-être un peu basique: je ne sais pas comment sélectionner les Area à partir de regionprops. Tout comme je n'arrive pas à voir comment utiliser l'option Orientation dans mon code. En fait, je n'arrive pas à voir à quoi ressemble le code pour effectuer ces manips.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Points : 11
    Points
    11
    Par défaut
    Re bonjour à tous,
    Avez vous la solution à mon problème? J'arrive vraiment pas à voir comment faire.

    Je sais récupérer l'aire, l'orientation etc mais je ne sais pas interargir avec eux.

  5. #5
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Peux-tu nous montrer le code où tu récupères l'aire et l'orientation ?

    Voilà un exemple qui pourrait t'aider. Si ton image binaire s'appelle bw, que tu souhaites afficher les résultats sous la forme d'un tableau et que les propriétés qui t'intéressent sont 'Centroid', 'MajorAxisLength' et 'MinorAxisLength', alors la commande que tu dois utiliser est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stats = regionprops('table',bw,'Centroid','MajorAxisLength','MinorAxisLength')

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta ligne de code. Voici ce que j'ai fait, ce qui est plutôt basique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Area = regionprops(BW, 'Area');
    Elipse = regionprops(BW, 'Orientation');
    Maintenant, ce que je voudrais, c'est coder l'algorithme suivant:

    POUR chaque region:
    - Si l'aire supérieure à 500 pixels :
    - On sélectionne la region concernée et on la colore en noir
    - Sinon
    - On récupère retourne l'orientation de la regio

    En gros, j'arrive à récupérer les valeurs qui m'intéressent dans les structures à l'aide de regionprops. Ce que je n'arrive pas à faire, à cause de mon manque de pratique sur Matlab, c'est lier la region aux conditions puis interargir sur la region pour modifier l'image. Je n'arrive pas à voir à quoi le code ressemblerait.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Points : 11
    Points
    11
    Par défaut
    J'ai finalement réussi à faire ce que je souhaitais faire! J'en suis plutôt surpris mais ça marche bien. Par contre, il doit y avoir beaucoup moins brouillon et beaucoup plus rapide...

    Par contre, je viens avec une nouvelle question, plus complexe cette fois je pense.
    J'ai des traits blancs sur fond noir et ces traits peuvent droit, inclinés ou même dessiner des courbes. J'aimerais être capable de remarquer ce qui dessinent une courbe trop abruptes, donc par exemple calculer le rayon de courbure. Je ne sais pas du tout comment faire ça. Dans mon cas, ça s'appliquerait à une surface donc... Une idée?

  8. #8
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Plusieurs solutions me viennent à l'esprit:
    Toujours en utilisant la fonction regionprops, l'option 'Centroid' donne le centre de masse : Si celui si est éloigné du "trait", tu peux considérer que c'est une courbe, s'il est dessus, c'est une droite)

    Sinon la détection des lignes droites dans un image peut se faire avec une transformée de Hough. Mais cela ne t'aideras pas à avoir des informations sur la courbure...

    Calculer les gradients de chaque courbe peut aussi être un début de solution (faire une approximation avec les coordonnées des pixels). Une ligne droite a une dérivée constante. Une courbe à une dérivée qui s'annule à un moment et les valeurs des gradients te donneront une idée de la "courbure".

    En espérant que ça réveille quelques idées en toi

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 47
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour ces quelques pistes à nouveau.
    Effectivement ça me donne quelques idées et j'ai déjà commencé à regarder quelques fonctions du genre. Notamment ici: http://www.developpez.net/forums/d52...rbes-surfaces/ mais je ne sais pas vraiment comment m'en servir.

    J'ai également pensé au centroid et je me demandais d'ailleurs s'il était possible de diviser une region en sous régions pour calculer des centroid locaux? Néanmoins je ne suis même pas sûr que ça puisse m'aider vraiment... Dans le cas où mon trait ferait un arc de cercle (ce qui ne devrait que très rarement se produire cependant).

    Je me demande donc s'il est possible de juxtaposer un cercle sur mon trait pour en déterminer le rayon? Ca serait une façon très simple de résoudre mon problème. Le problème étant peut être ici qu'au final je n'ai pas une droite mais une surface...

Discussions similaires

  1. Mesure angle Horizontal
    Par brayanrabat dans le forum Android
    Réponses: 0
    Dernier message: 10/07/2015, 01h44
  2. Récupération d'une mesure d'angle
    Par Nemesis_m dans le forum ImageJ
    Réponses: 4
    Dernier message: 31/10/2012, 02h03
  3. Réponses: 6
    Dernier message: 09/04/2007, 16h52
  4. angle entre 2 segments
    Par tane dans le forum Mathématiques
    Réponses: 4
    Dernier message: 25/09/2002, 16h47

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