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 :

Détection de centres de gravités dans une image dicom


Sujet :

Images

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Je travaille actuellement des images dicom d'un fantôme, constitué de billes sphériques réparties régulièrement dans l'espace 3D selon un motif cubique de 30 mm. Mes billes font 15 mm de diamètre et sont visibles sur la coupe IRM que je mets en pièce jointe au format jpeg (faute de pouvoir le mettre en dcm) par des "pseudo" cercles noirs (absence de signal en ces billes). Mon problème est le suivant : j'aimerais pouvoir d'une manière automatique détecter toutes les billes de ma coupe et déterminer de manière précise l'ensemble des centres de gravités. J'ai donc déjà commencé un code qui binarise l'image et exécute une fermeture morphologique pour enfin utiliser bwtraceboundaries et regionprops afin de détecter les centres de gravités. Mais pour le moment, tous les centres de gravités des billes ne sont pas détectés et il y a même des fausses détections. J'ai mis un faible critère sur l'aire de la région pour limiter les fausses détection mais le résultat n'est pas encore probant et des billes manquent à la détection.
    Merci pour toute aide que vous pourrez trouver, parce que j'ai essayer un peu tout dans le domaine morphologique (ouverture, fermeure, top-hat) et aussi détectionde contours mais peu de résultats satisfaisants...
    Ci-dessous, 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
    %variable pour reconstruire le nom
    name1='MR.'; 
    name3='.dcm';
     
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       %Lecture de la première image dicom
       %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        name=strcat(name1,int2str(cpt),name3);
        Ima1info=dicominfo(name);
        Ima1= dicomread(Ima1info);
        x0=Ima1info.ImagePositionPatient(1);
        y0=Ima1info.ImagePositionPatient(2);
        z0=Ima1info.ImagePositionPatient(3);
        op=Ima1info.ImageOrientationPatient;
        dimpix=Ima1info.PixelSpacing;
        nbcoupes=Ima1info.ImagesInAcquisition;
        Ima2=uint16(Ima1);      %Changement de format
        Ima5=imadjust(Ima2);    %Ajustement de la dynamique
     
    %%%%%%%%%%%%%%%
    % Binarisation 
    %%%%%%%%%%%%%%%
     
    level = graythresh(Ima2);
    Ima3 = im2bw(Ima2,level);
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Opérations morphologiques
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % Définition de l'élément structurant et fermeture
     
    se = strel('disk',4,0);  %ES forme disque de rayon lissé
    Ima4 = imclose(Ima3,se);
    figure (2)
    imshow(Ima4);
     
    %Détection des marqueurs par caractérisation des labels de régions
     
    [B,L,N] = bwboundaries(Ima4);   
    reg=regionprops(L,'Centroid','EquivDiameter','Area');
    Cg=[];      %Initialisation des variables 
     
    %Récupération des centres de gravités et rayons des sphères
     
        for i=N+1:length(reg)           
            Cg(i-N,: )=[reg(i).Centroid(1) reg(i).Centroid(2)];
    %         Ray(i-N)=reg(i).EquivDiameter/2;
            Aire(i-N)=reg(i).Area*dimpix(1)*dimpix(2);
        end
     
    cgf=[0 0];      %Initialisation des variables
    rayf=0;
    n=0;
    xy=[];
    but=1;
     
    %Détection des sphères sur image originale
     
    figure (3)                      
    imshow(Ima5,[],'notruesize');hold on;
    % theta=linspace(0,2*pi,150);   %tracé des cercles
        for i=1:size(Cg,1)
     
          if Aire(i)>=430
              Cg=Cg(i+1:size(Cg,1),: );
          end
        end
              cgf=[cgf;Cg];
              plot(cgf(2:size(cgf,1),1),cgf(2:size(cgf,1),2),'.');
        while but == 1                     % permet de rajouter des centres de gravités à la main
            [xi,yi,but] = ginput(1);
            plot(xi,yi,'.r')
            n = n+1;
            xy(n,: ) = [xi yi];
        end
    hold off;
    cgf=[cgf(2:size(cgf,1),: );xy];
     
    figure (4)
    hold on
    imshow(Ima5,[]);
    for i=1:size(cgf,1)
        plot(cgf(i,1),cgf(i,2),'.');
    end
    hold off
    Images attachées Images attachées  

  2. #2
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Bjr,
    On peut certainement argumenter sur ton code. par exemple je ne serais pas "philosophiquement" partisant de faire une binarisation en première étape car la binarisation te fait perdre une quantité phénoménale d'info. un tophat avant est probablement préférable.

    Cependant, ces arguments ont tous leur limite. La difficulté principale est que, en effet, l'oeuil "voit" des billes même là ou il n'y en a pas (au sens algorithmique du terme). Pourquoi , parceque tes billes sont sur une trame régulière et que l'oeuil les cherche aux noeuds de la trame.

    Est-il logique/licite/utile dans ta démarche de faire la même chose :
    - trouver les billes qui sortent facilement sans trop forcer. Celles dont tu peux être sur.
    - calculer la trame qui se fite sur leurs positions
    - rechercher en des noeuds précis lesbilles sur les noeuds encore vides ?

    OL

Discussions similaires

  1. Détection de nouveaux contours entrés dans une image
    Par dindoopenCV dans le forum OpenCV
    Réponses: 6
    Dernier message: 03/07/2013, 11h49
  2. calcul du centre de gravité d'une image
    Par lucciana dans le forum C++
    Réponses: 14
    Dernier message: 17/02/2011, 16h57
  3. Détection position des yeux dans une image
    Par Morvan Mikael dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 25/12/2008, 00h09
  4. Réponses: 4
    Dernier message: 03/02/2007, 18h18
  5. [D6] Algo de détection de zones dans une image
    Par DMO dans le forum Langage
    Réponses: 4
    Dernier message: 25/11/2005, 16h15

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