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

MATLAB Discussion :

Calculer les coordonnées des points d'une certaine valeur dans une matrice


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Calculer les coordonnées des points d'une certaine valeur dans une matrice
    Bonjour à tous,

    Disons que je dispose d'une matrice de grande dimension qui est constituée de 0 et de groupements de nombres 1, 2, 3...par exemple avec 1 seulement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=[0 0 0 0 0 ; 0 0 1 1 0  ; 0 0 1 1 0  ; 0 0 0 0 0 ; 0 0 0 0 0]
    J'aurais besoin de calculer les coordonnées des différents 1 et de retourner un vecteur colonne de ces coordonnées. Ici il est évident étant donnée la place des 1 que les coordonnées respectives attendues sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C=[2 3;
    2 4;
    3 3;
    3 4;
    ]
    J'imagine qu'il faut se servir de find mais find(A==1) ne donne que la position lue dans l'ordre d’apparition.

    Une fois ces coordonnées obtenues j'aurais aussi besoin de prendre le barycentre. Comme je travaille avec des images binaires (les 1 font en fait référence aux pixels d'un domaine blanc de l'image), j'ai pu lire qu'il suffisait de faire la moyenne des coordonnées de C. Mais n'y a t-il pas une manière plus exacte de calculer un barycentre ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Pour répondre à ta première question (même si je n'en vois pas l’intérêt) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [i,j] = find(A.');
     
    C = [j i]
    Pour la seconde question, puisque tous les points ont la même valeur, il suffit de moyenner leurs coordonnées.

    Si tu possèdes l'Image Processing Toolbox, tu peux le vérifier à l'aide de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regionprops(A, 'centroid')
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Effectivement, merci Dut c'est ce que je voulais faire, et j'ai également moyenné. En gros j'ai un fond noir et des cellules blanches pour lesquelles j'ai placé les centroïdes ainsi calculé.

    C'est un peu hors sujet, mais j'ai utilisé la fonction regionprops dont tu parles comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STATS = regionprops(label_image, 'Eccentricity','MajorAxisLength','MinorAxisLength');
    Pour chaque cellule j'obtiens les axes majeurs et mineurs qui sont apparemment des points mais j'ignore comment les représenter. J'ai entendu parler de quiver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quiver(STATS(1,1).MinorAxisLength,STATS(1,1).MajorAxisLength)
    Mais cela ne représente rien sur la première cellule par exemple.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par abel413 Voir le message
    Mais cela ne représente rien sur la première cellule par exemple.
    As-tu au moins lu la documentation de la fonction quiver ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Oui, j'ai même essayé avec les centroïdes de regionprops (mais j'obtiens les mêmes manuellement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hold on, quiver(STATS(1,1).Centroid(1),STATS(1,1).Centroid(2),STATS(1,1).MinorAxisLength,STATS(1,1).MajorAxisLength)
    Ceci ne trace pas deux axes mais une sorte de vecteur partant du centre de la première cellule orienté vers le bas. Peut-être est-ce normal ? En fait je m'attendais à deux axes orthogonaux comme ceux d'une ellipse par exemple.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Il te manque une information :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STATS = regionprops(label_image, 'Eccentricity','MajorAxisLength','MinorAxisLength','Orientation');
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Dut, mais je ne vois pas comment exploiter cet angle d'orientation. J'ai essayé de le multiplier par les axes et d'afficher les résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:size(CoG,1)
     
        hold on, quiver(CoG(i,1),CoG(i,2),STATS(i,1).MinorAxisLength*STATS(i,1).Orientation,STATS(i,1).MajorAxisLength*STATS(i,1).Orientation)
     
    end
    Le problème est que je ne comprends pas trop ce que je fais. Déjà les axes sont simplement des scalaires, de même que cet angle. Tout ce que j'obtiens ce sont des vecteurs partant des centres CoG orientés vraisemblablement par les valeurs des axes majeurs et mineurs et d'une norme plus grande qu'avant, certainement en raison de la multiplication que j'ai faite.

  8. #8

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Merci Winjerome,, j'ai finalement réussi de la sorte :

    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
    STATS = regionprops(label_image, 'centroid','Eccentricity','MajorAxisLength','MinorAxisLength','Orientation');
     
    for i=1:size(CoG,1)
     
    x1 = STATS(i,1).MajorAxisLength*[-1  1]/2*cos(STATS(i,1).Orientation*pi/180);
    y1 = STATS(i,1).MajorAxisLength*[1  -1]/2*sin(STATS(i,1).Orientation*pi/180);
    Major = line(x1+CoG(i,1) , y1+CoG(i,2));
     
    x2 = STATS(i,1).MinorAxisLength*[ 1 -1]/2*cos(STATS(i,1).Orientation*pi/180+pi/2);
    y2 = STATS(i,1).MinorAxisLength*[-1  1]/2*sin(STATS(i,1).Orientation*pi/180+pi/2);
    Minor = line(x2+CoG(i,1) , y2+CoG(i,2));
     
    hold on, plot(x1,y1,'k--'), plot(x2,y2,'k--')
     
    end
    J'utilise simplement mes centroides CoG calculés en prenant la moyenne des pixels des cellules. Cela affiche les axes de toutes les cellules blanches de l'image.

    Pardonnez-moi d'être encore hors sujet, mais finalement ici je me suis contenté d'utiliser les résultats de regionprops. Or on me demande de calculer centroides et axes à l'aide de la matrice des moments de l'image ou des cellules (ce n'est pas clair). Disons que pour les centroides c'est bon : j'utilise le moment d'ordre 1 en prenant la moyenne des pixels blancs de ces cellules. En revanche je ne vois pas du tout comment je pourrais trouver les axes c'est-à-dire les valeurs 'MajorAxisLength','MinorAxisLength','Orientation' sachant que j'ai codé un code qui me donne accès à tous les cellules blanches et leur pixels et les centres.

    EDIT:

    A l'aide de la fonction invmoments (lien) il est possible de calculer les moments d'ordre 1 à 7 pour toute l'image en niveau de gris ou bien seulement pour les cellules dont je parle. Je dispose d'une image appelée label_image constituée de 0, 1...70 (il y a 70 cellules) , chacune étant repérée par le nombre de 1, 2...70 de cette label_image. J'ai alors écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    M=zeros(70,7);
     
    for k=1:max(max(label_image))
     
    [i,j] = find(label_image==k);
    L = [j i];
    M(k,:)=invmoments(L);
     
    end
    J'obtiens alors une matrice 70*7 où je crois avoir sur chaque ligne les 7 moments des différentes cellules.

Discussions similaires

  1. Réponses: 18
    Dernier message: 28/02/2013, 16h59
  2. Réponses: 0
    Dernier message: 04/03/2012, 13h59
  3. Réponses: 3
    Dernier message: 29/03/2011, 20h38
  4. Réponses: 6
    Dernier message: 13/11/2009, 16h06

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