Bonjour,
J’avais déjà posté une question il y a quelques mois pour de l’analyse de cercle (voir ici). Mon code fonctionne depuis lors et le voici ci-dessous. Ce qu’il fait est de calculer le volume total de sphères contenu avec l’intérieur d’un grand cercle via une procédure expliquée par mes schémas en dessous.
En gros, on détecte le gros cercle, on l’élimine et on calcule le volume total (en détectant chaque petit cercle). Tout ça avec MATLAB et ImageJ (la première partie du code fait appel à ImageJ).
Ce que j’aimerais faire: j’aimerais pouvoir récupérer le diamètre du gros cercle que je détecte. Je ne vois pas comment implémenter cela dans mon code existant. Avez-vous une idée?
Merci !
Process:
Code:
close all
clear all
clc
% file:///Applications/MATLAB_R2018b.app/java/jar/
%% commands to start ij and mij
javaaddpath '/Applications/MATLAB_R2018b.app/java/jar/ij.jar'
javaaddpath '/Applications/MATLAB_R2018b.app/java/jar/mij.jar'
MIJ.start('/Applications/Fiji.app/plugins/'); %Hough transform plugin
%C:/Users/avillois/Downloads/fiji-win64/Fiji.app/plugins
%%
IJ=ij.IJ();
%% find water-in-oil droplets with ImageJ macro that uses Hough transform
macro_path=...
'/Users/NameofTheUser/Documents/imageJ_macro/Macro_waterinoil.ijm';
vol_tot_droplets=zeros(1,16);
index=0;
nloop=11; %position (1 to 16)
npic=300; %number of pictures, 1 to 300
res=cell(nloop,npic);
for loop=11:nloop
loop_index=loop;
for pic=1:npic
index=index+1;
pic_index=pic-1;
if pic_index<10
str=('abc');
newStr = strrep(str,'abc',strcat('00',num2str(pic_index)));
elseif pic_index<100
newStr = strrep(str,'abc',strcat('0',num2str(pic_index)));
elseif pic_index<1000
newStr = strrep(str,'abc',num2str(pic_index));
end
%Path to the pictures
im = mijread(strcat('/Users/NameOfTheUser/Desktop/33c_20umDhh1_initial_crop_loop',num2str(loop_index),'_100Hz_150usexp_100%lamp/1_001/ImgA000',newStr,'.tif'));
IJ.runMacroFile(java.lang.String(macro_path));
res_Hough=0;
[size1,size2]=size(res_Hough);
timecode = cputime;
while size2~=9; %the program moves on after some time if it does not find droplets
res_Hough=MIJ.getResultsTable();
[size1,size2]=size(res_Hough);
res{loop,pic}=MIJ.getResultsTable();
e = cputime-timecode
if e>60
size2=9;
end
end
prova=MIJ.getLog()
prova=string(prova);
prova_old=prova;
im_res=MIJ.getCurrentImage();
MIJ.run('Clear Results');
MIJ.run('Close All');
figure(1)
imshow(im_res,[0 255])
[size1_Hough,size2_Hough]=size(res_Hough);
mask=zeros(544,512);
for i=1:size1_Hough
k=res_Hough(i,2); %x and y are opposite in the picture and in the matrix. Equation to consider: (x-h)^2+(y-k)^2=r^2
h=res_Hough(i,3);
r=res_Hough(i,4);
%enter the circle
for x=32:544
for y=1:512
if (x-h)^2+(y-k)^2<(r-16)^2
if im_res(x,y)~=0
mask(x,y)=255;
end
end
end
end
%figure(index)
%imshow(mask);
[centers,radii] = imfindcircles(mask,[1 12], ...
'ObjectPolarity','dark','Sensitivity',0.95);
viscircles(centers,radii);
n_droplets=length(centers);
for d=1:length(radii) %d: number of rows in results table from imageJ
vol_tot_droplets(loop)=4./3*pi*radii(d)^3+vol_tot_droplets(loop);
end
mask=zeros(544,512); %puts the mask back to zero, before proceeding to the next water in oil droplets
end
res_Hough=0;
im_res=0;
end %end for cicle related to 300 pictures
end
+0
-0