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 :

Extraire une région à partir d'un polygon


Sujet :

Images

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut Extraire une région à partir d'un polygon
    Bonjour,

    Un autre problème
    J'ai une image satellite et je voudrais extraire une région comme le fait imcrop mais cette fois ci avec un polygon, pour cela j'ai deux vecteurs (PC,PL), un couple de points qui forme un masque quand je les affiches avec mapshow
    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
     
    idx = find(isnan(PC));
    idy = find(isnan(PL));
    xv = PC(1:idx(1)-1);
    yv = PL(1:idy(1)-1);
    IN = inpolygon(size(I,1),size(I,2),xv,yv);
     
    for n = 1:numel(idx)-1
        for m = 1:numel(idy)-1
     
        xv = PC(idx(n)+1:idx(n+1)-1);
        yv = PL(idy(m)+1:idy(m+1)-1);
     
        IN = IN | inpolygon(size(I,1),size(I,2),xv,yv);
        end
    end
    xv = PC(idx(end)+1:end);
    yv = PL(idy(end)+1:end);
    IN = IN | inpolygon(size(I,1),size(I,2),xv,yv);
    px = I(IN~=0)
    J'ai fait se code mais je ne sais pas si c'est juste parceque ça ne marche pas.
    Mes vecteurs contiennent des valeurs NaN.
    I c'est l'image.
    Je voudrais savoir si c'est la bonne façon de la faire et si c'est le cas de me corriger ou est ce qu'il y aurai une autre façon de la faire ?

  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 rock_kader Voir le message
    J'ai fait se code
    Tiens, moi aussi

    Les deux premiers arguments de inpolygon devraient normalement contenir les coordonnées des pixels de l'image contenue dans la varibale I. Tu peux d'aider de la fonction meshgrid
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Envoyé par Dut
    Tiens, moi aussi

    J'ai ajouter meshgrid, voilà donc le code :
    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
     
    idx = find(isnan(PC));
    idy = find(isnan(PL));
    xv = PC(1:idx(1)-1);
    yv = PL(1:idy(1)-1);
    [X,Y] = meshgrid(1:size(I,1),1:size(I,2));
    IN = inpolygon(X(:),Y(:),xv,yv);
     
    for n = 1:numel(idx)-1
        for m = 1:numel(idy)-1
     
        xv = PC(idx(n)+1:idx(n+1)-1);
        yv = PL(idy(m)+1:idy(m+1)-1);
     
        IN = IN | inpolygon(X(:),Y(:),xv,yv);
        end
    end
    xv = PC(idx(end)+1:end);
    yv = PL(idy(end)+1:end);
    IN = IN | inpolygon(X(:),Y(:),xv,yv);
    ValeurSatellites(IN) = 0;
    px = I(IN~=0)
    J'ai l'erreur suivante
    Error using |
    Inputs must have the same size.
    Les inputs doivent etre de la meme taille, mais je ne vois comment
    Merci beaucoup pour ton aide Dut

  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 884
    Points
    52 884
    Par défaut
    Pourquoi y a-t-il deux boucles imbriquées ?
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    J'ai crus qu'il fallait mettre un index pour chaque vecteur pour trouver les valeurs NaN, sauf qu'un index suffit parcequ'ils sont au meme endroit, donc j'ai retiré la 2ieme boucle, Voilà :
    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
    idx = find(isnan(PC));
    xv = PC(1:idx(1)-1);
    yv = PL(1:idx(1)-1);
    [X,Y] = meshgrid(1:size(I,1),1:size(I,2));
    IN = inpolygon(X(:),Y(:),xv,yv);
    for n = 1:numel(idx)-1
     
        xv = PC(idx(n)+1:idx(n+1)-1);
        yv = PL(idx(n)+1:idx(n+1)-1);
     
        IN = IN | inpolygon(X(:),Y(:),xv,yv);
    end
    IN = IN | inpolygon(X(:),Y(:),xv,yv);
    ValeurSatellites(IN) = 0;
    px = I(IN~=0);
    Sauf que, quand j’exécute, matlab est toujours occupé à calculer, je voudrais savoir si la taille de l'image I (3712 * 3712) et la taille des deux vecteurs PC et PL (1 * 51738) sont la cause ... Normalement oui
    Au début ses deux vecteurs représenter la latitude et la longitude du contour de la région, puis je les ai transformer en coordonnées de pixels sur l'image grâce au coordonnées cartésiennes et je m’aperçois qu'il y a des couples qui se répètes, je me suis dis si j'élimine les couples qui se répète je gagne un peut de temps dans le calcule, est qu'il est possible de supprimé les couples qui se répètent ?

  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 884
    Points
    52 884
    Par défaut
    Pour diminuer le temps de calcul, il ne faut pas tester tous les pixels de l'image.

    Tu peux simplifier en ne testant que ceux qui se trouve dans le rectangle englobant un polygone.
    Donc une portion des coordonnées générées initialement avec meshgrid

    Pour déterminer les dimensions de ce rectangle, il te suffit de trouver les coordonnées minimale et maximale des points formant le polygone (avec min et max)

    Bien entendu, plus la surface du rectangle obtenu sera petite par rapport à celle de l'image, plus tu verras un gain de temps significatif.
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Maintenant la taille de l'image et de (600*700), pour les couples j'ai fais la soustraction avec le min des lignes pour le vecteur PL et avec le min des colonne pour le vecteur PC, ainsi les couples seront à l’intérieure du polygone.
    Si non je reviens pour le fait de supprimé les couples qui se répètent, Voilà un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    h=[3 3 3 3 3 5 5 5 5 5 NaN 6 6 6 6 6 7 7 7 7 7 NaN 8 8 8 8 8];
    k=[4 4 4 6 6 1 1 1 1 4 NaN 6 4 4 5 5 7 7 9 9 3 NaN 8 8 0 0 0];
    A = [h;k];
    [lign,col]=size(A);
    AA=A(:,27:-1:1);
    b = unique(AA','rows'):
    AAA = b'
     
    AAA =
     
         3     3     5     5     6     6     6     7     7     7     8     8   NaN   NaN
         4     6     1     4     4     5     6     3     7     9     0     8   NaN   NaN
    Maintenant je voudrais les remettre dans le meme ordre que le vecteur A

  8. #8

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Merci Jérome
    Voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    h=[3 3 3 3 3 5 5 5 5 5 NaN 6 6 6 6 6 7 7 7 7 7 NaN 8 8 8 8 8];
    k=[4 4 4 6 6 1 1 1 1 4 NaN 6 4 4 5 5 7 7 9 9 3 NaN 8 8 0 0 0];
    A = [h;k];
    [lign,col]=size(A);
    AA=A(:,27:-1:1);
    l=AA';
    [b, ia] = unique(l,'rows','first');
    d=l(sort(ia));
    g=d';
    gg=g(:,14:-1:1);
     
    gg =
     
         3     3     5     5   NaN     6     6     6     7     7     7   NaN     8     8
    Mais je ne vois comment faire pour la 2ieme ligne
    Elle n'apparait pas, pourquoi ????

  10. #10
    Invité
    Invité(e)

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    La taille des deux vecteurs et de (1 * 2000), le temps de calcule est plus petit et c'est très bien.
    Maintenant comment récupérer le polygone découper sous forme d'image ??
    je m'aperçois que px est un vecteur !! Je ne sais pas comment faire, si non j'ai fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BW = poly2mask(pixC,pixL,difPL,difPC);
    figure, imshow(BW);axis on
    pixC, pixL sont les nouveaux vecteurs de PC et PL. difPC et difPL sont la hauteur et la largeur de l'image, le résultat est un masque binaire.
    Je cherche à savoir comment récupérer le polygone sous forme d'image à partir de la fonction inpolygon, si non comment superposer le masque binaire avec l'image pour que les indices de la matrice de l'image reste les mêmes à l’intérieure du polygone et des zéros à l’extérieure.
    Je vous remercie vraiment pour votre aide

  12. #12
    Invité
    Invité(e)
    Par défaut
    Il te suffit d'utiliser BW comme tu as voulu le faire avec IN :

  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 rock_kader Voir le message
    je m'aperçois que px est un vecteur !!
    Tu peux très bien passer une matrice en argument d'entrée de inpolygon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IN = inpolygon(X, Y, ...);
    Sinon, il existe des implémentations plus rapides sur le File Exchange
    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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    Le problème est résolue. J'ai juste une petite remarque à dire; en utilisant la fonction poly2mask ça ne prend quasiment pas de temps par contre inpolygone prends du temps pour donnée le résultat, donc j'opte pour la fonction poly2mask.
    Je vous remercie

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/09/2010, 14h14
  2. extraire une matrice à partir d'un *.xls*
    Par bassemb dans le forum MATLAB
    Réponses: 3
    Dernier message: 31/01/2010, 21h13
  3. Extraire une Date à partir d'une String dans un fichier
    Par Dalidou dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 18/03/2009, 09h19
  4. Extraire une image à partir d'un TJvrichedit
    Par diden138 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/03/2008, 19h19
  5. Extraire une date à partir d'une chaine de caractère
    Par soso78 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/12/2007, 16h41

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