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 :

Demande de conseils pour divers problèmes


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 109
    Points : 63
    Points
    63
    Par défaut Demande de conseils pour divers problèmes
    Bonjour,

    Mon programme me permet jusqu'à présent de faire un traitement d'images en boucle. Mes images sont récupérer d'un film et correspondent à des cellules (mes objets) seules ou aggrégées entre elles sur un fond avec un peu de bruit. Je récupère alors le nombre d'objets qui sont étiquetés ainsi que leur diverses propriétés (regionprops).

    Des problèmes se posent à moi, ne souhaitant travailler que sur certains objets de ma série d'images, je comptais en 1er le nombre de cellules seules dans mes images d'après mon seuillage.

    1. Afin d'isoler mes cellules seules, je voudrais à partir d'un cercle de rayon connu, faire correspondre son centre avec ceux des objets détectés et si l'objets est entièrement dans le cercle alors je le considère comme cellule seule sinon je ne l'utilise pas

    A noter, les cellules touchant les bords sont exclues mais après un certain nombre d'images elles peuvent s'être déplacée et apparaitre entièrement dans l'image. Souhaitant travailler sur un minimum de 15 images successives, je souhaiterais aussi pouvoir prendre en compte celles qui apparaissent plus tardivement mais dont les données seraient utilisables!

    2. le compte des cellules par image est faux si je travaille sur plusieurs images : je ne sais où mettre count=count+1 dans ma boucle.

    3. je répère mes objets via leur étiquette mais mes séries d'images ne se ressemblent pas forcément comme voulu .... Il faudrait que j'arrive à suivre les objets avec l'intermédiaire de leur centre et rayon. comment puis-je faire?


    Ensuite, après avoir réussi avec votre aide à résoudre mes problèmes, je souhaiterais pour chaque cellule seule, faire une boucle sur la série d'images pour chaque objet suivi afin d'obtenir l'angle de rotation de celle-ci (regionsprops.Orientation)

    Je vous remercie d'avance de tous vos conseils et de votre aide qui depuis le début me sont fortement utiles, je n'en serais pas arrivée là toute seule!

    Bien cordialement,
    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
    clear all, close all, clc
     
    %*************************************************************************%
    % Demande des données pour le nombre d'images et les valeurs de seuillage
    N=input('quel est le nombre total d''images? ');
    seuil=input('quel est l''aire pour le seuil des cellules seules? ');
    tail_disq=input('tail disq ');
    petite_aire=input('petite_aire ');
    % demander le rayon et aire=pi*r²
    %*************************************************************************%
     
    %*************************************************************************%
    for k=1:N
        % CHARGEMENT et affichage des images 
        fname=sprintf('%d.tif',k);
        I{k}=imread(fname);
        figure(k) 
        imshow(I{k}), colormap gray
     
    %     level1=graythresh(I{1});
    %     bw1 = im2bw(I{1},level1);
    %     bw1=imclearborder(bw1);
    %     fill1=imfill(bw1,'holes');
    %     b1=bwboundaries(fill1);
    %     L1=bwlabel(fill1,8); 
    %     reg1=regionprops(L1,'All');
    %     tail_disq=ceil(max([reg1.EquivDiameter])/2);
    %     petite_aire=ceil(pi()*(max([reg1.EquivDiameter])/2)^2);
     
        % SEUILLAGE/segmentation
        se=strel('disk',tail_disq);
        % morphologie en niveaux de gris (linéarisation)
        background{k}=imclose(I{k},se); 
        I2{k}=imsubtract(background{k},I{k}); % soustraction de l'illumination
        level=graythresh(I2{k});
        bw{k}=im2bw(I2{k},level); % conversion en image binaire
        bw{k}=bwareaopen(bw{k},petite_aire);   % suppression des petits objets
        % élimination des objets qui touchent la bordure de l'image
        bw{k}=imclearborder(bw{k}); 
        % remplissage interne du contour des objets détectés
        fill{k}=imfill(bw{k},'holes'); 
     
        % MESURE DES PROPRIETES DE TOUS LES OBJETS DETECTES
        % Récupération des contours de tous les objets détectés
        b{k}=bwboundaries(fill{k});
        L{k}=bwlabel(fill{k},8); 
        % récupération de différentes données avec l'instruction regionprops : 
        % aire, centre de gravité, diamètre équivalent, cadre de limitation...
        reg{k}=regionprops(L{k},'All');
    end
    %*************************************************************************%
     
    %*************************************************************************%
    % Tracé, sur chaque image originale, des contours et des centres de gravité
    % des objets détectés seuls
    figure(k)
    hold on
    count=0; % initialisation 
    le=length(reg{k});
    for i=1:le
        for k=1:N
            figure(k)
            hold on
            if  reg{k}(i).Area < seuil 
                % tracé des contours
                plot(b{k}{i}(:,2),b{k}{i}(:,1),'b','LineWidth',2);
                rnd=ceil(length(b{k})/(mod(rand*i,7)+1));
                h=text(b{k}{i}(rnd,2)+1,b{k}{i}(rnd,1)-1,num2str(i));
                set(h,'Fontsize',10,'FontWeight','bold');
                % tracé des centres de gravités
                plot(reg{k}(i).Centroid(1), reg{k}(i).Centroid(2),'*')
                % récupération des mesures de propriétés des objets détectés
                d{k}{i}=[reg{k}(i).EquivDiameter];
                a{k}{i}=[reg{k}(i).Area];
                alpha{k}{i}=[reg{k}(i).Orientation];
                count = count+1; 
            end   
            % affichage du nombre décompté dans la boucle précédente
            title(['Il y a ' num2str(count/N) ' cellules seules dans cette image.'])
        end    
    end

  2. #2
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Salut,

    J'ai fait quelque modification, mais je ne l'ai pas essayé:
    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
     
    clear all, close all, clc
     
    %*************************************************************************%
    % Demande des données pour le nombre d'images et les valeurs de seuillage
    N=input('quel est le nombre total d''images? ');
    seuil=input('quel est l''aire pour le seuil des cellules seules? ');
    tail_disq=input('tail disq ');
    petite_aire=input('petite_aire ');
    % demander le rayon et aire=pi*r²
    %*************************************************************************%
     
    %*************************************************************************%
    for k=1:N
        % CHARGEMENT et affichage des images 
        fname=sprintf('%d.tif',k);
        I{k}=imread(fname);
        figure(k) 
        imshow(I{k}), colormap gray
     
    %     level1=graythresh(I{1});
    %     bw1 = im2bw(I{1},level1);
    %     bw1=imclearborder(bw1);
    %     fill1=imfill(bw1,'holes');
    %     b1=bwboundaries(fill1);
    %     L1=bwlabel(fill1,8); 
    %     reg1=regionprops(L1,'All');
    %     tail_disq=ceil(max([reg1.EquivDiameter])/2);
    %     petite_aire=ceil(pi()*(max([reg1.EquivDiameter])/2)^2);
     
        % SEUILLAGE/segmentation
        se=strel('disk',tail_disq);
        % morphologie en niveaux de gris (linéarisation)
        background{k}=imclose(I{k},se); 
        I2{k}=imsubtract(background{k},I{k}); % soustraction de l'illumination
        level=graythresh(I2{k});
        bw{k}=im2bw(I2{k},level); % conversion en image binaire
        bw{k}=bwareaopen(bw{k},petite_aire);   % suppression des petits objets
        % élimination des objets qui touchent la bordure de l'image
        bw{k}=imclearborder(bw{k}); 
        % remplissage interne du contour des objets détectés
        fill{k}=imfill(bw{k},'holes'); 
     
        % MESURE DES PROPRIETES DE TOUS LES OBJETS DETECTES
        % Récupération des contours de tous les objets détectés
        b{k}=bwboundaries(fill{k});
        L{k}=bwlabel(fill{k},8); 
        % récupération de différentes données avec l'instruction regionprops : 
        % aire, centre de gravité, diamètre équivalent, cadre de limitation...
        reg{k}=regionprops(L{k},'All');
     
    %*************************************************************************%
     
    %*************************************************************************%
    % Tracé, sur chaque image originale, des contours et des centres de gravité
    % des objets détectés seuls
      figure(k)
      hold on
      count=0; % initialisation 
      le=length(reg{k});
      for i=1:le
            if  reg{k}(i).Area < seuil 
                % tracé des contours
                plot(b{k}{i}(:,2),b{k}{i}(:,1),'b','LineWidth',2);
                rnd=ceil(length(b{k})/(mod(rand*i,7)+1));
                h=text(b{k}{i}(rnd,2)+1,b{k}{i}(rnd,1)-1,num2str(i));
                set(h,'Fontsize',10,'FontWeight','bold');
                % tracé des centres de gravités
                plot(reg{k}(i).Centroid(1), reg{k}(i).Centroid(2),'*')
                % récupération des mesures de propriétés des objets détectés
                d{k}{i}=[reg{k}(i).EquivDiameter];
                a{k}{i}=[reg{k}(i).Area];
                alpha{k}{i}=[reg{k}(i).Orientation];
                count = count+1; 
            end   
            % affichage du nombre décompté dans la boucle précédente
            title(['Il y a ' num2str(count) ' cellules seules dans cette image.'])
        end    
    end
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Merci pour ta réponse pour le problème du "count" mais en fait, je souhaiterais garder la 1ère boucle tel quel afin de ne travailler par la suite qu'avec mes objets que j'aurais détectés si possible en les suivant avec leur centre par exemple plutôt que grace à la numérotation pré-établie. Il faudra peut-être que je compte totalement autrement!

    Je continue de chercher même si les idées ne viennent pas vraiment mais c'est que je n'ai pas l'habitude d'écrire des programmes étant donné mon cursus!

    A bientôt,

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/07/2006, 09h42
  2. demande de conseils pour l'api windows
    Par altadeos dans le forum Windows
    Réponses: 3
    Dernier message: 28/03/2006, 13h09
  3. [Conception] Demande de conseil pour validation de commentaires
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 20/12/2005, 14h58
  4. Réponses: 16
    Dernier message: 15/11/2005, 20h07
  5. Demande de conseil pour migration de lignes vers colonnes
    Par ririd dans le forum Administration
    Réponses: 6
    Dernier message: 04/11/2004, 17h02

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