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 :

Sélectionner une partie d'image segmentée [Débutant]


Sujet :

Images

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut Sélectionner une partie d'image segmentée
    Bonjour à tous,

    Je travaille actuellement sur un projet où je dois segmenter des images CT pour en retirer seulement les muscles, ensuite pouvoir les sélectionner pour ne générer que le muscle voulu en 3D avec les autres slices...

    Et là je bloque un peu car j'ai segmenté mon image pour obtenir que les muscles, mais il y a de la peau et autres qui ont le même threshold et j'aimerais éliminer ces inclusions. Seulement je ne sais pas comment faire. J'aurais 2 questions :

    1) En gros, j'ai cette image en pièce jointe. Il faudrait enlever la peau et les autres choses autour mais en gardant un maximum la forme des muscles.

    J'ai essayé imerode, imdilate, imopen etc... mais je perds trop "d'informations" car il supprime les muscles intercostaux par exemple.

    Alors j'ai pensé à créer un objet (ou autre) en balayant toute la matrice et en sélectionnant les pixels qui sont l'un à côté de l'autre. Donc par exemple, la peau ferait un objet, le muscle un autre, et le reste serait soit détruit ou formerait d'autre objets.

    Comme ça je ne perdrais pas d'informations en déformant le muscle, mais je ne vois pas trop comment m'y prendre. Auriez-vous un point de départ?

    2) Je voudrais ensuite n'avoir que cette objet (les muscles) et le superposer sur l'image original en transparence pour pouvoir comparer les deux images, est-ce possible?

    Merci d'avance pour votre aide!
    Images attachées Images attachées  

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,
    Citation Envoyé par Memboro Voir le message
    Alors j'ai pensé à créer un objet (ou autre) en balayant toute la matrice et en sélectionnant les pixels qui sont l'un à côté de l'autre. Donc par exemple, la peau ferait un objet, le muscle un autre, et le reste serait soit détruit ou formerait d'autre objets.
    Cela s'appelle une analyse en composante connexes, et ça peut se faire à l'aide de bwlabel si tu as l'image processing toolbox.

    Citation Envoyé par Memboro Voir le message
    2) Je voudrais ensuite n'avoir que cette objet (les muscles) et le superposer sur l'image original en transparence pour pouvoir comparer les deux images, est-ce possible?
    Le sujet a déjà été abordé sur le forum, je t'invite à faire une petite recherche.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup pour ton aide! Par contre je rencontre encore quelques problèmes et je ne comprends pas bien la signification du code je crois.

    Voici mon 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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    figure(3),
    imshow(I_valk_med, []); title('Segmented image');
     
    %% Morphological operations I
     
    %     L = bwlabel(BW,N) returns a matrix L, of the same size as BW,
    %     containing labels for the connected components in BW. N can have a
    %     value of either 4 or 8, where 4 specifies 4-connected objects and 8
    %     specifies 8-connected objects; if the argument is omitted, it defaults
    %     to 8.
     
    [Label, NUM]=bwlabel(I_valk_med);
     
    %for Obj = 1 : NUM
        [Im_muscles]=Label;
        for i = 1 : size(Im_muscles,1)
            for j = 1 : size(Im_muscles,2)
                if Im_muscles(i,j) ~= 6 % valeur pour sélectionner les muscles trouvé à l'aide de la boucle for précédente
                    Im_muscles(i,j)= 0;
                end
            end 
        end
        figure(4),
        imshow(Im_muscles, []); title('Muscles');
    %end
     
     
    %% Comparaison des images en les superposant
     
    % Essai1
    figure(5),
    imshow(Im_filtree_med, [])
    hold on
     
    cmap = [1 1 1   % Couleur RGB pour les valeurs 0 de Im_muscles (fond)
            0 0 1]; % Couleur RGB pour les valeurs 1 de Im_muscles (contour)
     
    Im_muscles_RGB = ind2rgb(Im_muscles,cmap);
    h = imshow(Im_muscles_RGB, []);
     
    set(h,'alphadata',Im_muscles)
     
    hold off
     
    % Essai 2 avec dégradé
     
    figure(6),
    imshow(Im_filtree_med, [])
    hold on
     
    cmap = [1 1 1   % Couleur RGB pour les valeurs 0 de Im_muscles (fond)
            0 0 1]; % Couleur RGB pour les valeurs 1 de Im_muscles (contour)
     
    Im_muscles_RGB2 = ind2rgb(Im_muscles,cmap);
    h = imshow(Im_muscles_RGB2, []);
     
    alph = double(Im_muscles);
    alph = alph-min(alph(:));
    alph = alph/max(alph(:));
    set(h,'alphadata',alph)
     
    hold off
     
    % Essai 3
     
    figure(7),
    imshow(Im_filtree_med, [])
     
    hold on
     
    cmap = [1 1 1   % Couleur RGB pour les valeurs 0 de Im_muscles (fond)
            0 0 1]; % Couleur RGB pour les valeurs 1 de Im_muscles (contour)
     
    Im_muslces_RGB3 = ind2rgb(Im_muscles,cmap);
    h = imshow(Im_muslces_RGB3, []);
     
    alph = double(Im_filtree_med);
    alph = alph-min(alph(:));
    alph = alph/max(alph(:));
    set(h,'alphadata',alph)
     
    hold off
     
    % Essai 4
     
    figure(8),
    imshow(Im_filtree_med, [])
     
    hold on
     
    cmap = [1 1 1   % Couleur RGB pour les valeurs 0 de Im_muscles (fond)
            0 0 1]; % Couleur RGB pour les valeurs 1 de Im_muscles (contour)
     
    Im_muslces_RGB3 = ind2rgb(Im_muscles,cmap);
    h = imshow(Im_muslces_RGB3, []);
     
    set(h,'alphadata',Im_filtree_med)
     
    hold off
    Les images sont jointes et dans l'ordre (Im_muscles, essai 1, essai 2, essai 3 et essai 4)

    Donc mon I_valk_med correspond à la matrice de l'image segmentée après thresholding (elle contient des 0 et des 5. Si je remplace les 5 par des 1, ça ne change rien).
    Ensuite j'applique le bwlabel pour ne sortir que les muscles. Donc ma matrice contient ensuite des 0 et des 6. Là si je remplace les 6 par des 1, en fait, je perds la couleur bleu sur le calque. Je ne sais pas exactement pourquoi?

    Ensuite, pour l'essai 1 et 2, on dirait qu'il me prend l'image segmentée plutôt que l'image filtrée comme image de fond.

    Puis pour l'essai 3 et 4, il me prend bien l'image filtrée comme image de fond, mais avec des parties blanches qui ne viennent de je ne sais pas où car elle n'apparaissent pas sur l'image filtrée. De plus, à la place de mettre Im_muscles dans set, j'ai mis Im_filtree_med, ce qui ne fait pas un réel sens d'après ce que j'ai vu sur Colorer les contours obtenus avec la fonction EDGE. Puis, si je ne mets pas l'effet de dégradé, ça me donne une image très bizarre (essai 4).

    Donc pourriez-vous m'expliquer exactement comment fonctionne cette partie de code svp?
    Et est-il possible d'augmenter la transparence? Car comme j'ai compris, avec alphadata, c'est fait automatiquement, juste?

    Encore merci pour votre aide!
    Images attachées Images attachées      

  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
    Essaie avec la dernière méthode comme ceci :

    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
    I = Im_filtree_med;
    BW = Im_muscles==6;
     
    figure
    colormap(gray)
    imagesc(I);
    axis image
     
    hold on
     
    cmap = [0 0 0   % Couleur RGB pour les valeurs 0 de BW1 (fond)
            0 0 1]; % Couleur RGB pour les valeurs 1 de BW1 (contour)
     
    RGB(:,:,1) = BW*cmap(2,1)+~BW*cmap(1,1);
    RGB(:,:,2) = BW*cmap(2,2)+~BW*cmap(1,2);
    RGB(:,:,3) = BW*cmap(2,3)+~BW*cmap(1,3);
     
    image(RGB,'alphadata',BW)
     
    axis 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)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Merci, ça marche!!!!

    Juste une dernière question concernant la transparence :
    Est-il possible de l'augmenter ou non, car je suis allé sur le site ci-dessous, mais je ne suis pas sûr d'avoir compris. Il faudrait utiliser AlphaDataMapping?

    http://www.mathworks.ch/ch/help/matl...html#AlphaData

    En tout cas, merci pour votre aide!

  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 : 53 166
    Points
    53 166
    Par défaut
    Il n'y a que deux niveaux de transparence.

    Si BW = 0 => opaque
    Si BW = 1 => transparent
    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
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Ah ok, merci beaucoup pour ton aide.

    J'aurais encore une question pour un code qui me semble correct (de plus, je n'ai pas de message d'erreur) mais qui prend un temps considérable, ou alors il tourne en rond, je ne sais pas et j'aimerais savoir s'il y a un moyen d'alléger le coût de calcul par une autre formulation.

    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
     
    % On fixe le nombre de thresholds que l'on désire, minimum 8 pour afficher
    % les muscles
     n=8;
     
        % thresh est un vecteur 1xn qui contient les thresholds
        % metric correspond à l'efficacité à segmenter l'image en n+1 classes
        [thresh_med, metric_med] = multithresh(Im_filtree_med, n);
     
        % Apply the thresholds to obtain segmented image
        I_seg_med = imquantize(Im_filtree_med, thresh_med);
     
        % on affiche les images segmentées correspondant aux muscles
        [I_valk_med]=I_seg_med;
        for i = 1:size(I_valk_med,1)
            for j = 1:size(I_valk_med,2)
                for k = 1 : n-1              
                    if sum(I_valk_med(:)==k) > sum(I_valk_med(:)==k+1)
                       val_muscles = k;
                    else val_muscles = k+1;
                    end
                end
     
                % On modifie la matrice pour ne garder que la partie muscles,
                % peau, ...
                if I_valk_med(i,j) ~= val_muscles % val_muscles correspond au nombre pour sélectionner le threshold correspondant aux muscles, à la peau, ...
                   I_valk_med(i,j)= 0;
                end
     
            end
        end
    En gros, où il a du mal, c'est sur la boucle for avec la somme qui renvoie la valeur du threshold qui retourne la plus grande partie segmentée, à savoir les muscles.

    De plus, je profite maintenant de demander comme ça je ne créerai pas de topic supplémentaire. Plus tard, je veux séparer les différents muscles, les colorer et qu'ensuite, l'utilisateur choisisse un muscle en cliquant dessus et que ca le fasse en 3D directement. Pour ce faire, je devrai utiliser une interface GUI, est-ce exact? Même si ce n'est qu'un clic, du moment où il y a une interaction avec l'utilisateur, il faut une interface graphique?

    Merci beaucoup!


    EDIT : En fait j'ai trouvé une autre méthode assez lourde mais qui marche. Donc merci pour votre aide.

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

Discussions similaires

  1. Sélectionner et enregistrer une partie d'image
    Par hennou dans le forum OpenCV
    Réponses: 2
    Dernier message: 30/04/2011, 15h38
  2. [Débutant] sélectionner une partie d'une image sous matlab
    Par info_plus dans le forum Images
    Réponses: 6
    Dernier message: 18/05/2010, 16h44
  3. Sélectionner une partie d'une image
    Par b_reda31 dans le forum Delphi
    Réponses: 2
    Dernier message: 12/07/2007, 17h32
  4. comment copier une partie d'image
    Par mouchie82 dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/06/2006, 14h43
  5. extraire une partie d'image d'une image source
    Par Zen_Fou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2006, 11h20

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