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