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 :

contourf => matrice 2D


Sujet :

MATLAB

  1. #1
    Membre confirmé Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Par défaut contourf => matrice 2D
    Bonjour à tous,

    Actuellement je m'amuse un peu avec la détection de contours sur une image, et j'en suis arrivé à utiliser la fonction contourf qui permet d'afficher à la fois les contours mais aussi de remplir les zones à l'intérieur de ces contours.

    Les résultats sont très intéressants, cependant j'ai un petit soucis au niveau de l'exportation des résultat.

    En effet je souhaiterai stocker l'image résultat que me donne contourf dans une matrice 2d. En somme, cela revient à avoir une image segmentée. Je ne cherche pas à avoir une image au format .png en sortie mais bel et bien une matrice 2D.

    Ma question est la suivante : est il possible (à partir de la contour matrix) de remplir une matrice 2D (image) ?

    J'ai éssayé d'utiliser une fonction trouvée sur le FEX qui permet de convertir la contour matrice en position xyz (ou xy représente les coordonnées dans la matrice 2D et z étant la valeur à attribuer à la case de la matrice), cependant les résultats ne sont pas les mêmes que l'image affichée par contourf.

    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
    img = rand(100);
    [C,h] = contourf(img(end:-1:1,:),2);
     
    [x_cell,y_cell,z] = C2xyz(C);
    z = z./z(2);
     
    img_contour = zeros(size(img));
     
    for ii = 2:length(x_cell)
     
        y = size(img,1) - floor(y_cell{ii}) + 1;
        x = floor(x_cell{ii});
        y(isnan(x)) = [];
        x(isnan(x)) = [];
     
        img_contour(y,x) = z(ii);
     
    end
     
    figure
    imagesc(img_contour)
    et le lien vers la fonction C2xyz

    En espérant avoir été assez clair, merci d'avance à celui qui pourra m'aider

    Alex

  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 317
    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 317
    Par défaut
    Je ne comprends pas très bien ce que tu cherches à obtenir au final.

    Voici ce que tu peux faire :

    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
    img = rand(10);
    figure(1)
    clf
     
    subplot(1,2,1)
    [C,h] = contourf(img(end:-1:1,:),2);
     
    [x_cell,y_cell,z] = C2xyz(C);
     
    subplot(1,2,2, 'box', 'on')
     
    hold on
    for n = 1:length(x_cell)    
        plot(x_cell{n}, y_cell{n}, '-')
    end
    axis tight
    Images attachées Images attachées  

  3. #3
    Membre confirmé Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Par défaut
    Bonjour Jerome Briot,

    Je vais essayer d'être un peu plus clair :

    Parmis les deux images que tu as mis, celle de gauche (ou il y a des zones colorisées) est ce que je cherche à obtenir. Le problème c'est que contourf te permet juste d'afficher ce résultat, et non pas de le récupérer dans une matrice nommée "img_contour" (matrice qui pourrait ensuite être affichée avec imagesc ou sur laquelle on pourrait effectuer d'autres calculs).

    Sur cette image donc, on voit trois couleurs (rouge vert bleu). Considérons que le rouge/vert/bleu correspondent aux valeurs 1/2/3, si on regarde ton image dans le coin haut gauche, on voit que le pixel aux positions i = 1, j = 1 est rouge, donc dans la matrice que je souhaite obtenir il faudrait mettre img_contour(1,1) = 1;

    Le problème donc c'est utiliser les positions xy obtenues à partir de la fonction C2xyz pour remplir petit à petit la matrice M.

    Est ce plus clair ?

  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 317
    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 317
    Par défaut
    Voici une solution consistant à prendre une capture de l'image :

    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
    img = rand(10);
     
    num_levels = 5;
     
    figure(1)
    clf
     
    contourf(img(end:-1:1,:), num_levels);
    axis equal tight
     
    fig = figure(2);
    clf
     
    [C,h] = contourf(img(end:-1:1,:), num_levels, 'lineStyle', 'none');
    pixels_coeff = 50;
    set(gcf, 'units', 'pixels', 'position', 10+[1 1 size(img)*pixels_coeff])
    set(gca, 'units', 'pixels', 'position', 10+[1 1 size(img)*pixels_coeff], 'visible', 'off')
     
    f = getframe(gca);
    levels = get(h, 'LevelList');
    num_color = numel(levels);
    [img_contour, map] = rgb2ind(f.cdata, num_color);
     
    % La ligne suivante est nécessaire mais je ne saurais pas expliquer
    % pourquoi ?
    img_contour(end,:) = [];
     
    imwrite(img_contour, map, 'contourf.png')
     
    close(fig)
    Images attachées Images attachées   

  5. #5
    Membre confirmé Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Par défaut
    Super idée que d'utiliser le getframe ! Mais il y a un dernier problème avec ce que tu proposes, img_contour n'a plus du tout la même taille que img. Je comprends qu'il faut forcement un upscale pour bien tout afficher correctement, mais n'est il pas possible d'avoir img_contour qui à une taille proportionnelle à img ?

    Note : si on prend on voit bien que les tailles n'ont rien à voir.

  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 317
    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 317
    Par défaut
    Juste une inversion au niveau des dimensions :

    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
    img = rand(10,5);
     
    num_levels = 5;
     
    figure(1)
    clf
     
    contourf(img(end:-1:1,:), num_levels);
    axis equal tight
     
    fig = figure(2);
    clf
     
    [C,h] = contourf(img(end:-1:1,:), num_levels, 'lineStyle', 'none');
    pixels_coeff = 50;
    set(gcf, 'units', 'pixels', ...
        'position', [1 1 10+size(img,2)*pixels_coeff 10+size(img,1)*pixels_coeff])
    set(gca, 'units', 'pixels', ...
        'position', [5 5 size(img,2)*pixels_coeff size(img,1)*pixels_coeff], ...
        'visible', 'off')
     
    f = getframe(gca);
    levels = get(h, 'LevelList');
    num_color = numel(levels);
    [img_contour, map] = rgb2ind(f.cdata, num_color);
     
    % La ligne suivante est nécessaire mais je ne saurais pas expliquer
    % pourquoi ?
    img_contour(end,:) = [];
     
    imwrite(img_contour, map, 'contourf.png')
     
    close(fig)
    Images attachées Images attachées   

  7. #7
    Membre confirmé Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Par défaut
    Je ne suis pas sur de bien comprendre ce que font ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pixels_coeff = 50;
    set(gcf, 'units', 'pixels', ...
        'position', [1 1 10+size(img,2)*pixels_coeff 10+size(img,1)*pixels_coeff])
    set(gca, 'units', 'pixels', ...
        'position', [5 5 size(img,2)*pixels_coeff size(img,1)*pixels_coeff], ...
        'visible', 'off')
    Si on a Est ce que les lignes précédentes deviennent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pixels_coeff = 50;
    set(gcf, 'units', 'pixels', ...
        'position', [1 1 y+size(img,2)*pixels_coeff y+size(img,1)*pixels_coeff])
    set(gca, 'units', 'pixels', ...
        'position', [x x size(img,2)*pixels_coeff size(img,1)*pixels_coeff], ...
        'visible', 'off')
    Edit : Bon en fait c'est la ligne suivante qui faisait tout foirer chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set(gca, 'units', 'pixels', ...
        'position', [x x size(img,2)*pixels_coeff size(img,1)*pixels_coeff], ...
        'visible', 'off')
    Du coup en la supprimant ca fonctionne parfaitement merci beaucoup !

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Non, le décalage sert juste à avoir une capture plus propre avec getframe en éloignant l'objet Axes des bords de l'objet Figure.

    Dans le code ci-dessus, la fenêtre fait 10 pixels de plus que l'image et l'image elle-même est positionnée au milieu de la fenêtre (5 = 10/2)

    Tu ne devrais pas avoir à modifier ces valeurs dans le code.

    Attention toutefois à ce que la taille de l'image à capturer ne soit pas plus grande que la taille de l'écran…

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

Discussions similaires

  1. [Débutant] Contourf d'une matrice avec les xmin xmax etc
    Par yonafunu dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/05/2011, 17h51
  2. [CR] entête et pied sur page 1/B de matrice
    Par chloe.j3 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/09/2002, 12h07
  3. Matrice de filtrage ?
    Par gimlithedwarf dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/08/2002, 09h44
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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