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 :

Recentrer les coordonnées d'une matrice


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Recentrer les coordonnées d'une matrice
    Bonjour tout le monde,
    Grâce à vous, j'ai pu avancer sur mon script mais je suis une nouvelle fois bloqué.
    Je rappelle ma démarche :
    Je travaille sur une image raster qui contient un certain nombre d'objets que je souhaite extraire pour en analyser leur morphométrie.
    Pour ce faire, j'utilise un algorithme de contour actif qui va me permettre de tracer selon un vecteur pente le contour de chacun de mes objets.
    J'ai réussi cette opération et j'en suis même arrivé à obtenir les propriétés morphométriques de mes objets.
    Toutefois, il y a encore quelques réglages à faire pour arriver aux résultats attendus.
    L'algorithme de contour actif ne peut être lancé qu'une seule fois sur l'image. Pour résoudre ce problème, j'ai donc créé des fenêtres de 40x40 pixels centrées sur mes objets.
    L'algorithme est ensuite lancé sur le centre de l'image (qui correspond au centre de l'objet) qui possède des coordonnées fixes pour toutes les fenêtres : chaque fenêtre fait normalement 40x40 pixels. Je fais donc démarrer mon algorithme aux coordonnées de pixel x=20 et y=20. Mon souci est le suivant (et exposé dans l'image ci-dessous) : dans certains cas, j'ai des objets qui se localisent sur les bords de mon image raster générale. J'ai donc fait en sorte de redimensionner mes fenêtres selon cette situation. Il m'arrive donc parfois d'avoir des fenêtres plus petites que 40x40 pixels : par exemple 28x40, ou 40x36, etc... C'est bien là le problème car j'ai paramétré l'algorithme au centre de l'image. Or, si j'applique les mêmes règles à ces fenêtres de dimension différente, mon centre se retrouve décalé par rapport à l'objet étudié et l'algorithme tourne dans le vide.

    Nom : Problème.jpg
Affichages : 389
Taille : 985,7 Ko



    Auriez-vous des pistes à me proposer pour régler le problème?
    J'ai pensé à deux choses :
    - Soit compléter les vides de matrice par une image miroir
    - Soit convertir mes coordonnées de pixel en coordonnées géographiques
    Merci d'avance pour votre aide,
    Rdmato33

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Peux-tu nous montrer le script associé afin que l'on puisse voir à quel endroit interviennent les coordonnées du centre?
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci Gooby pour ta réponse (encore une fois).
    Voici 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    %Lecture image raster
    [svf,R]=geotiffread('../images/svf.tif');
    svf=mat2gray(svf);
     
    %Lecture des centres des objets
    [points,R]=geotiffread('../images/points2.tif');
    points=double(points);
     
    %Conversion centres en image binaire (points=1, reste=0)
    mask=zeros(size(points))
    mask(points>0)=1
    points=mask
     
    %Obtention des coordonnées (pixels) des centres
    [x,y]=ind2sub(size(points),find(points==1));
    xy_points=[x(:) y(:)];
     
    %Créer fenêtre de 40x40 pixels et adapter la taille selon la position par
    %rapport au bord de l'image
    L=max(1,xy_points(:,1)-20);
    R=min(xy_points(:,1)+20,size(svf,1));
    T=max(1,xy_points(:,2)-20);
    B=min(xy_points(:,2)+20,size(svf,2));
     
    %Création d'une cell array contenant autant de matrices que d'objets
    for m=1:19;
    samples{m}=svf(L(m):R(m),T(m):B(m));
    end
     
    %Application de l'algorithme de contour actif
     %Création d'une boucle pour enregistrer et convertir une image par objet
       for p=1:length(samples)
           imwrite(samples{p},sprintf('../images/image%d.pgm',p));  
           [I,map] = rawread(sprintf('../images/image%d.pgm',p)); 
           I=imresize(I,1);
     
      % Calcul du gradient vector flow sur la fenêtre de 40x40 pixels
         disp(' Compute edge map ...');
         f = 1-I/255; 
         f0 = gaussianBlur(f,1);
         [px,py] = gradient(f0);
     
       % Début de la déformation
         colormap(copper(64)); 
         image(((1-f)+1)*30); axis('square', 'off');
         t = 0:1:2;
         x = 20+1*cos(t); % c'est ici que je localise l'origine de la déformation
         y = 20+1*sin(t); 
         [x,y] = snakeinterp(x,y,2,0.5);
         snakedisp(x,y,'r') 
         pause(1);
     
         for i=1:12,
           [x,y] = snakedeform2(x,y,0.05,0,1, 1, 0.15,px,py,5);
           [x,y] = snakeinterp(x,y,0.5,0.2);
           snakedisp(x,y,'r') 
           title(['Deformation in progress,  iter = ' num2str(i*5)])
           pause(0.1);
         end
     
         colormap(gray(64)); 
         image(((1-f)+1)*40); axis('square', 'off');
         snakedisp(x,y,'r'); 
         title(['Final result,  iter = ' num2str(i*5)]);
     
         % Création d'une image binaire (intérieur/extrérieur) à partir des
         % coordonnées x,y et stockage dans un tableau de cellules.
         tableau{1,p}=poly2mask(x,y,50,50)
    end 
     
        % Calcul de la morphométrie
        for K=1:19
            rprops(K)=regionprops(tableau{1,K},'Area','Eccentricity','MajorAxisLength','MinorAxisLength','Perimeter')
        end
        Areas=[rprops.Area];
        MajorAxisLengths=[rprops.MajorAxisLength];
        MinorAxisLengths=[rprops.MinorAxisLength];
        [Areas(:),MajorAxisLengths(:),MinorAxisLengths(:)]
     
        clearvars -except rprops
    Merci

  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 : 53 166
    Points
    53 166
    Par défaut
    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = size(I,2)/2 + 1*cos(t);
    y = size(I,1)/2 + 1*sin(t);
    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
    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 : 53 166
    Points
    53 166
    Par défaut
    Ou sans doute encore mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = (size(I,2)-20) + 1*cos(t);
    y = (size(I,1)-20) + 1*sin(t);
    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)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonjour Dut,
    Merci pour ta réponse.
    Je viens de tester ton code. Je n'ai pas vraiment l'impression que ça change quelque chose.
    En fait, je souhaiterais recentrer l'algorithme sur mes objets et non pas sur le centre de l'image (dans le cas d'une fenêtre inférieure à 40x40 pixels).
    Or, c'est ce que ton algorithme semble faire (centrer sur l'image).
    J'aimerais en fait pouvoir utiliser les coordonnées de mes objets (que j'ai dans un tableau : xy_points) pour lancer l'algorithme en prenant comme origine ces valeurs x y et non pas le centre de l'image.

Discussions similaires

  1. Travail sur les éléments d'une matrice.
    Par Jefeh dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/11/2007, 15h10
  2. Supprimer les 0 d'une matrice
    Par bernard6 dans le forum MATLAB
    Réponses: 1
    Dernier message: 19/08/2007, 14h52
  3. Comparaison de toutes les lignes d'une matrice
    Par hidies dans le forum MATLAB
    Réponses: 10
    Dernier message: 16/05/2007, 11h11
  4. Déterminer les coordonnées d'une image
    Par blaise4714 dans le forum Images
    Réponses: 2
    Dernier message: 27/11/2006, 19h05
  5. recuper les valeurs d'une matrice
    Par marcelsoh1 dans le forum C
    Réponses: 2
    Dernier message: 06/09/2006, 16h48

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