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 :

[bwarea/fill] Calcul de l'aire de disques [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [bwarea/fill] Calcul de l'aire de disques
    Bonjour
    Je suis une nouvelle utilisatrice de matlab (quelques semaines..). Et grace aux infos que j'ai trouvé sur les forums j'ai reussi à programmer quelque chose (merci) mais c'est assez lent…
    J’ai des disques dont je connais les positions des centres et les rayons. Et je voudrais avoir une idée de l’air projetée.

    J’utilise la function bwarea de matlab. Le code marche mais j’ai un pb de vitesse et de memoire (segmentation fault) si je fais trop de relances.

    Voila mon script :

    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
    discount %nb de disques
    %X matrice avec les position des centres pour chaque disque
    discX = X(1,:);
    discY = X(2,:);
    discRadius=r;
     
    figure('Position',Pos1,'Visible', 'off')
    hold on
     
    for i=1:discCount
        c=discX(i);
        b=discY(i);
        circle(c,b,discRadius);
    end
    axis equal
    axis off
    hold off 
     
    print -f -djpeg 'projection'
    b = imread('projection.jpg');
    delete('projection.jpg')
    b = im2bw(b); 
    %b=b;%(200:700,352:952); %crop the image
    intensity=bwarea(b);
    et j’appelle circle qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function [x y]=circle(a,b,r)
    theta = linspace(0,2*pi,100000);    
    x = a+r*cos(theta);                 
    y = b+r*sin(theta);                 
    %plot(x,y);                        % plot circle
    fill(x,y,'k')
    axis('equal');% set equal scale on axes per pixel
    end
    J’utilise la function bwarea de matlab. Mais du coup, il me faut une image binaire.
    Est ce que c’est possible de sauvegarder (dans une matrix) les point du cercles qui sont remplie par le fill et de juste les compter (sans consruire une vraie image)?
    Ou est ce qu’il y a une fonction comme fill qui donne une matrice au lieu d’une image?
    Je ne sais pas si j’ai été assez claire, dites moi s’il vous faut plus d’infos.
    Merci beaucoup!

  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 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Nadge Voir le message
    J’ai des disques dont je connais les positions des centres et les rayons. Et je voudrais avoir une idée de l’air projetée.
    Je ne comprend pas ce que tu appelles "aire projetée" ?

    Pourquoi ne pas simplement calculer la surface des disques dès le départ ?
    Pourquoi passer par une image ?
    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
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Pour la 1ère partie, c'est vectorisable (a priori ça gagne du temps mais je n'ai pas fait d'énormes tests) :
    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
    %discount %nb de disques
    %X matrice avec les position des centres pour chaque disque
     
    %Tests
    % X = [1 2 3 4;
    %     1 2 3 4];
    % discCount = size(X,2);
    % r = 2;
     
    fig = figure('Position',Pos1,'Visible', 'off')
     
    N = 100000;
    theta = linspace(0,2*pi,100000);
    x = repmat(X(1,:)',1,N)+repmat(r*cos(theta),discCount,1);
    y = repmat(X(2,:)',1,N)+repmat(r*sin(theta),discCount,1);
    fill(x',y','k')
    axis('equal');% set equal scale on axes per pixel
    axis equal
    axis off
     
    print -f -djpeg projection
     
    %** Fermer la figure, car comme elle est invisible tu ne la vois plus mais elle prend des ressources
    close(fig);
     
    b = imread('projection.jpg');
    delete('projection.jpg')
    b = im2bw(b);
    %b=b;%(200:700,352:952); %crop the image
    intensity=bwarea(b);
    Pour la suite je ne suis pas assez calée en images pour t'aider.
    Règles du Forum

    Adepte de la maïeutique

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Une idée avec polyarea :
    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
    clear
    X = [1 2 3 4;
        1 2 3 4];
    r=2;
    N=1000;
    Nc=4;%Nombre de cercles
    x=zeros(1,N+1)';y=zeros(1,N+1)';
    int=0;
    for c=1:Nc-1
        for k=c+1:Nc
            int=int+1;
            d(int)=sqrt((X(1,k)-X(1,c))^2+(X(2,k)-X(2,c))^2);%Distance entre centres
            theta(int)=2*acos(d(int)/r/2);
            surf(int)=(r^2*theta(int)/2-r^2*sin(2*theta(int)));%Surfaces communes
            if isreal(surf(int))==0
                surf(int)=0;
            end
        end
    end
    for c=1:Nc
        L = linspace(0,2*pi,N);
        xv=r*cos(L)'+X(1,c);
        yv=r*sin(L)'+X(2,c);
        xv = [xv ; xv(1)]; yv = [yv ; yv(1)];
        x(:,c)=xv;y(:,c)=yv;
        A(c) = polyarea(xv,yv);
        plot(x(:,c),y(:,c)); title(['Aire = ' num2str(A)]); axis image
        hold on
    end
    %Surface projetée
    S=sum(A)-sum(surf)
    polyarea est utilisé pour les polygones, ici on peut évidemment mettre l'aire du cercle :
    Si les cercles sont projetés, il faut multiplier le résultat par le cosinus de l'angle des plans.

  5. #5
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    J’ai des disques dont je connais les positions des centres et les rayons.
    Dans R^2 ou dans R^3 ?
    Et je voudrais avoir une idée de l’air projetée.
    Projetée sur quoi?
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci beaucoup pour ces réponses!
    Je vais essayer l'idée de Phryte, ça a l'air d'être exactement ce que je cherche!!

    Ce que j'appellais aire projetée c'est juste l'aire totale des disques en fait.
    Mais comme les disques se recouvrent en partie (distances entre centres < au rayon), je ne veux pas compter plusieurs fois les aires des intersections.

    Donc je me suis mal exprimée, ce n'est pas une projection, je suis dans R^2, les disques sont tous dans le plan (sans inclinaisons).

    Je suis passée par une image parce que j'avais trouvé la fonction bwarea de matlab qui prend une image et du coup je n'avais pas cherché mieux... Mais effectivement, je dois pouvoir éviter.

    Caro-Line.
    La fonction repmat c'est pour éviter de faire une boucle for et tracer tous les disques en meme temps?

  7. #7
    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 884
    Points
    52 884
    Par défaut
    Citation Envoyé par phryte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Une idée avec polyarea :
    Le même code... optimisé à la sauce MATLAB :

    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
    X = [1 2 3 4;
        1 2 3 4];
     
     
    r = 2;
    N = 1000;
    Nc = size(X,2); %Nombre de cercles
     
    int = 0;
    for c = 1:Nc-1
        for k = c+1:Nc
            int = int+1;
            d(int) = sqrt((X(1,k)-X(1,c))^2+(X(2,k)-X(2,c))^2);%Distance entre centres
        end
    end
     
    theta = 2*acos(d/r/2);
    srf = (r^2*theta/2-r^2*sin(2*theta));%Surfaces communes
    srf = real(srf);
     
    L = linspace(0,2*pi,N).';
     
    xv = bsxfun(@plus,r*cos(L),X(1,:));
    yv = bsxfun(@plus,r*sin(L),X(2,:));
     
    xv = [xv ; xv(1,:)];
    yv = [yv ; yv(1,:)];
     
    A = polyarea(xv,yv);
     
    %Surface projetée
    S = sum(A)-sum(srf);
    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)

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour et merci Dut. Plus élégant.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Pour matlab, je pense que c'est bon.
    Je crois que ce n'est plus qu'un problème de maths maintenant (pour le calcul de srf).
    Par exemple quand plusieurs disques se recouvrent complètement (ils ont le même centre), j'obtiens 1.5 fois l'aire du disque.
    Et quand il y a des intersections entre plusieurs disques, je peux obtenir des aires totales plus petites que l'aire d'un disque! Parce qu'on supprime plusieurs fois la même zone.

    Par exemple avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X = [1 1 2;
        1 2 2];
    r = 2;

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Et quand il y a des intersections entre plusieurs disques, je peux obtenir des aires totales plus petites que l'aire d'un disque! Parce qu'on supprime plusieurs fois la même zone.
    Effectivement cela n'est pas dans les mêmes conditions.

    Une idée avec polyarea (à travailler et vérifier):
    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
    clear
     X = [1 1 2;
        1 2 2];
    r=2;
    N=100;
    Nc=size(X,2); %Nombre de cercles
    for c=1:Nc
    L = linspace(0,2*pi,N);
    xv=r*cos(L)'+X(1,c);
    yv=r*sin(L)'+X(2,c);
    xv = [xv ; xv(1)]; yv = [yv ; yv(1)];
    x(:,c)=xv;y(:,c)=yv;
    end
    [lat,lon] = POLYBOOL('union',x(:,1),y(:,1),x(:,2),y(:,2));%Cercles 1 et 2
    [lat,lon] = POLYBOOL('union',lat,lon,x(:,3),y(:,3));%Intersection avec cercle 3
     
    plot(lon,lat)
    grid
    surface_union=polyarea(lon,lat)

  11. #11
    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 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Nadge Voir le message
    Par exemple quand plusieurs disques se recouvrent complètement (ils ont le même centre), j'obtiens 1.5 fois l'aire du disque.
    Ce cas particuliers peut être traité en amont du code en comparant les valeurs dans X et en ne conservant qu'un seul des disques qui se chevauchent dans X
    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)

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Ce cas particuliers peut être traité en amont du code en comparant les valeurs dans X et en ne conservant qu'un seul des disques qui se chevauchent dans X
    Merci Dut!
    J'ai fait ça avec
    et ça marche! Un problème de moins!!

    Il me reste plus que le pb des "intersections multiples".
    Phryte, j'ai essayé ton script mais j'ai un message d'erreur qui apparait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ??? Undefined function or method 'polybool' for input arguments of type 'char'.

    Je suis assez vite perdue avec les initialisations de variables. Et je ne sais pas laquelle devrait être d'un autre type que 'char' et pourquoi.
    Et polybool n'apparait pas dans l'aide.

    Qu'est ce que c'est exactement? Une fonction qui construit un polygone qui englobe les cercles? Est ce que ça s'écrit bien comme ça? ou est ce que c'est une fonction qu'il faut que j'écrive??
    Merci!

  13. #13
    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 884
    Points
    52 884
    Par défaut
    Citation Envoyé par Nadge Voir le message
    Et polybool n'apparait pas dans l'aide.
    Il semble que ce soit une fonction de la Mapping Toolbox : http://www.mathworks.com/access/help.../polybool.html
    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)

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci! Je n'avais même pas penser à chercher sur internet...
    Je vais demander si je peux avoir cette toolbox.

  15. #15
    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 884
    Points
    52 884
    Par défaut
    Regarde ceci : Polygon Clipper ou ceci : Polygon_Intersection
    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)

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    J'ai utilisé "Polygon Clipper" pour former les nouveaux contours avant de calculer l'aire. Et ça a l'air de bien marcher! Merci beaucoup!!

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

Discussions similaires

  1. calcul d'une aire problème d'affichage
    Par jéjéleboss dans le forum Scilab
    Réponses: 2
    Dernier message: 13/09/2010, 19h22
  2. [isosurface] Calcul de l'aire d'une surface
    Par kamelcompte dans le forum Images
    Réponses: 6
    Dernier message: 24/10/2008, 12h32
  3. calcul de l'aire visible d'une sphère
    Par zarbiman dans le forum OpenGL
    Réponses: 11
    Dernier message: 13/08/2008, 13h47
  4. Calculer le diamètre d'un disque
    Par Lost in dans le forum Images
    Réponses: 5
    Dernier message: 12/03/2008, 06h45
  5. Calcul de l'aire sous une courbe
    Par ramrouma dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/05/2007, 23h11

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