APPENDICE B
Algoritmi in Matlab
Algoritmi implementati nella GUI per l’estrazione delle
variabili dalle immagini delle cellule di Purkinje
Caricamento delle immagini ed avvio della GUI
% --- Executes on button press in b_carica.
function b_carica_Callback(hObject, eventdata, handles) % hObject handle to b_carica (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global foto; global bw; global DM; global N; global nu; global fileNames2; global me; global t; global gg; global fine;
% Viene selezionata la cellula da analizzare coltura=get(handles.e_coltura,'String'); cellula=get(handles.e_cellula,'String'); fileFolder = fullfile('C:','Documents and
Settings','Utente','Desktop','ProgMatlab','SOFTWARE_PURKINJE','Immagini'
,sprintf('Coltura%s',coltura),sprintf('%s%s',coltura,cellula)); dirOutput1 = dir(fullfile(fileFolder,'s_*.bmp')); dirOutput2 = dir(fullfile(fileFolder,'f_*.bmp')); fileNames1 = {dirOutput1.name}' fileNames2 = {dirOutput2.name}' nu=numel(fileNames1); addpath(fileFolder) tempo=get(handles.e_tempo,'String'); t=str2num(tempo);
% Si costruisce il data-matrix DM=zeros(1,178,t);
% Le immagini della cellula in diversi istanti di tempo vengono lette ed analizzate in successione for N=(t-nu)+1:t scheletro1=imread(fileNames1{N-t+nu}); S = char(fileNames1{N-t+nu}); [a b gg d] = strread(S, '%s %s %d %d', 'delimiter', '_'); level = graythresh(scheletro1); scheletro = im2bw(scheletro1,level); foto=imread(fileNames2{N-t+nu}); % Si visualizza lo scheletro axes(handles.a_immagine); imshow(scheletro);
title(handles.a_immagine,sprintf('Foto numero %s',num2str(gg))) axis equal;
axis tight; axis off;
% Si calcola l'mmagine binaria
level = graythresh(foto); bw = im2bw(foto,level);
% Vengono eseguite in successione le diverse analisi b_centro_Callback(hObject, eventdata, handles); b_raggiominimo_Callback(hObject, eventdata, handles); b_rmax_Callback(hObject, eventdata, handles);
b_cerchi1_Callback(hObject, eventdata, handles);
b_intersezioni1_Callback(hObject, eventdata, handles); b_semilog1_Callback(hObject, eventdata, handles); b_loglog1_Callback(hObject, eventdata, handles); b_percestr1_Callback(hObject, eventdata, handles); b_percasse1_Callback(hObject, eventdata, handles); b_cerchi2_Callback(hObject, eventdata, handles);
b_intersezioni2_Callback(hObject, eventdata, handles); b_semilog2_Callback(hObject, eventdata, handles);
b_loglog2_Callback(hObject, eventdata, handles); b_percestr2_Callback(hObject, eventdata, handles); b_percasse2_Callback(hObject, eventdata, handles); b_estensione_Callback(hObject, eventdata, handles); b_soma_Callback(hObject, eventdata, handles);
b_retta1_Callback(hObject, eventdata, handles); cd('C:\Documents and
Settings\Utente\Desktop\ProgMatlab\SOFTWARE_PURKINJE') b_box_Callback(hObject, eventdata, handles);
DM(1,173,gg)=me; DM(1,178,gg)=fine; dm=DM(:,:,gg); cd(fileFolder)
save(sprintf('datamatrix%s%s%s.mat',coltura,cellula,num2str(gg)),'dm', '-mat')
end;
cd(fileFolder)
save(sprintf('datamatrix%s%s.mat',coltura,cellula),'DM','-mat') cd('C:\Documents and
Settings\Utente\Desktop\ProgMatlab\SOFTWARE_PURKINJE')
Selezione del tipo di immagine visualizzata
% --- Executes on selection change in pop_immagine.
function pop_immagine_Callback(hObject, eventdata, handles) % hObject handle to pop_immagine (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns pop_immagine contents as cell array
% contents{get(hObject,'Value')} returns selected item from pop_immagine
% Gli edit vengono inizializzati a zero str = get(hObject, 'String');
switch str{val}
case 'Foto' % Visualizza l'immagine originaria global foto; axes(handles.a_immagine); imshow(foto); axis equal; axis tight; axis off;
case 'Binaria' % Visualizza l'immagine binaria global bw; axes(handles.a_immagine); imshow(bw); axis equal; axis tight; axis off;
case 'Scheletro' % Visualizza lo scheletro dell'immagine global scheletro; axes(handles.a_immagine); imshow(scheletro) axis equal; axis tight; axis off; end;
Visualizzazione in successione delle immagini in diversi istanti di tempo
% --- Executes on button press in b_filmato.
function b_filmato_Callback(hObject, eventdata, handles) % hObject handle to b_filmato (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global foto; global nu; global fileNames2; for N=1:nu foto=imread(fileNames2{N}); axes(handles.a_immagine); imshow(foto); axis equal; axis tight; axis off; pause(1); end;
Individuazione delle coordinate del centro
% --- Executes on button press in b_centro.
function b_centro_Callback(hObject, eventdata, handles) % hObject handle to b_centro (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro;
global xc;
global yc;
global gg;
global DM;
% Gli edit vengono inizializzati a zero set(handles.edit_xc,'String','')
set(handles.edit_yc,'String','')
% Si visualizza lo scheletro dell'immagine axes(handles.a_immagine);
imshow(scheletro);
title (sprintf('Foto numero %s Seleziona il centro e il raggio minimo',num2str(gg)))
axis equal; axis tight; axis off;
% Il centro viene individuato con il clic del mouse [xc,yc,but]=ginput(1);
if but==3 return end
set(handles.edit_xc,'String',num2str(round(xc))) set(handles.edit_yc,'String',num2str(round(yc))) DM(1,176,gg)=xc;
DM(1,177,gg)=yc;
Individuazione del raggio minimo
% --- Executes on button press in b_raggiominimo.
function b_raggiominimo_Callback(hObject, eventdata, handles) % hObject handle to b_raggiominimo (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global xc;
global yc;
global scheletro;
global gg;
global DM;
% Gli edit vengono inizializzati a zero set(handles.e_rmin,'String','');
% L’estremità del raggio minimo viene individuato con il clic del mouse [x3,y3,but]=ginput(1);
if but==3 return
end
% Calcolo del il raggio minimo rmin=sqrt(((xc-x3)^2)+((yc-y3)^2)); set(handles.e_rmin,'String','');
set(handles.e_rmin,'String',num2str(round(rmin))); DM(1,174,gg)=rmin;
Calcolo del raggio massimo
% --- Executes on button press in b_rmax.
function b_rmax_Callback(hObject, eventdata, handles) % hObject handle to b_rmax (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global ax; global ay; global gg; global DM;
% L’edit viene inizializzato a zero set(handles.e_rmax,'String','');
% Per calcolare il raggio massimo viene misurata la distanza di tutti i pixel dell'immagine dal centro e viene preso come raggio massimo la distanza massima
[ro,c]=find(1-scheletro); l=length(ro);
for i=1:l rm(i)=sqrt(((xc-c(i))^2)+((yc-ro(i))^2)); end; [rmax,v] = max(rm); ax=c(v); ay=ro(v); set(handles.e_rmax,'String','')
set(handles.e_rmax,'String',num2str(round(rmax))) DM(1,175,gg)=rmax;
Costruzione del sistema di riferimento a cerchi costanti
% --- Executes on button press in b_cerchi1.
function b_cerchi1_Callback(hObject, eventdata, handles) % hObject handle to b_cerchi1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO1; global gg;
% Viene creata una matrice di zeri di dimensioni pari a quelle dell'immagine
[m,n]=size(scheletro); B=zeros(size(scheletro)); SO1=zeros(size(scheletro)); SO1=SO1+(1-scheletro);
s=(rmax-rmin)/9; % Distanza inter-cerchio (si vogliono costruire 10 cerchi)
% Un pixel di B viene posto uguale ad uno se rispetta l'equazione del cerchio for r=rmin:s:rmax for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; SO1=SO1+B; end;
axes(handles.a_immagine); imshow(1-SO1);
title(handles.a_immagine,sprintf('Foto numero %s Primo sistema di riferimento',num2str(gg)))
axis equal; axis tight;
Calcolo delle intersezioni nel sistema di riferimento a cerchi costanti
% --- Executes on button press in b_intersezioni1.
function b_intersezioni1_Callback(hObject, eventdata, handles) % hObject handle to b_intersezioni1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO; global Intersezioni1; global DM; global N; global gg; [m,n]=size(scheletro); B=zeros(size(scheletro)); s=(rmax-rmin)/9; indice=0;
% Si inizializza a zero l'array del numero di intersezioni per cerchio Int=zeros(1,10); for r=rmin:s:rmax indice=indice+1; for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end;
end;
end;
% Viene calcolata la matrice data dalla somma della matrice che
rappresenta l'immagine e la matrice che rappresenta ciascun cerchio e si va a vedere quando questa matrice assume il valore 2. Nei punti di
intersezione infatti i pixel delle due metrici che assumono valore 1, sommandosi danno il valore 2
[ro,c,v]=find(T>1);
% L'immagine somma viene resa binaria ponendo a 1 i pixel che assumono valore 2 e a 0 tutti gli altri
for i=1:m; for j=1:n if T(i,j)==2; T(i,j)=1; else T(i,j)=0; end end end;
% Il numero di intersezioni viene determinato effettuato la segmentazione della nuova immagine:ciascuna regione individuata corrisponde ad un intersezione [L,num] = bwlabel(T,8); B=zeros(size(scheletro)); Int(indice)=num; end; for i=1:9 if Int(i)==0 for j=i+1:9 if Int(j)>0 Int(i)=1 end end end end if Int(10)==0 Int(10)=1 end Intersezioni1=Int set(handles.l_intersezioni1,'Value',1)
set(handles.l_intersezioni1,'String',{num2str(Intersezioni1(1)),num2str( Intersezioni1(2)),num2str(Intersezioni1(3)),num2str(Intersezioni1(4)),nu m2str(Intersezioni1(5)),num2str(Intersezioni1(6)),num2str(Intersezioni1( 7),num2str(Intersezioni1(8)),num2str(Intersezioni1(9)),num2str(Intersezi oni(10))});
% Calcolo del numero massimo di intersezioni set(handles.e_nmax1,'String','');
[Nm1,i]=max(Intersezioni1);
set(handles.e_nmax1,'String',num2str(Nm1));
% Calcolo del raggio del cerchio corrispondente al numero massimo di % intersezioni(raggio critico)
set(handles.e_rcritico1,'String',''); r=[rmin:s:rmax];
rc1=r(i);
% Calcolo dell'indice di ramificazione di Schoenen (rapporto tra il numero massimo di intersezioni e il numero di dentriti primari) set(handles.e_schoenen1,'String','');
dp1=Intersezioni1(1); S1=Nm1/dp1;
set(handles.e_schoenen1,'String',num2str(S1)); DM(1,1:10,gg)=Intersezioni1; DM(1,11,gg)=rc1; DM(1,12,gg)=Nm1; DM(1,13,gg)=S1;
Metodo di Sholl lineare nel sistema di riferimento a cerchi costanti
% --- Executes on button press in b_lineare1.
function b_lineare1_Callback(hObject, eventdata, handles) % hObject handle to b_lineare1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global rmin;
global rmax;
global Intersezioni1;
% Numero di intersezione per area del cerchio in funzione del raggio s=(rmax-rmin)/9; r=rmin:s:rmax y=Intersezioni1./(pi*(r.^2)); figure plot(r,y,'o')
Metodo di Sholl Semi-Log nel sistema di riferimento a cerchi costanti
% --- Executes on button press in b_semilog1.
function b_semilog1_Callback(hObject, eventdata, handles) % hObject handle to b_semilog1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global rmin; global rmax; global Intersezioni1; global Rsl1; global DM; global N; global gg;
% Logaritmo del numero di intersezione per area del cerchio in funzione del raggio
s=(rmax-rmin)/9; r=rmin:s:rmax;
y=Intersezioni1./(pi*(r.^2));
%Calcolo del coefficiente di correlazione set(handles.e_rsl1,'String','') l=log10(y) TF = isinf(l) for i=1:length(TF) if TF(i)==1 l(i)=[ ] r(i)=[ ] end end C1=corrcoef(r,l); Rsl1=-C1(1,2);
set(handles.e_rsl1,'String',num2str(Rsl1)) DM(1,15,gg)=Rsl1;
% Calcolo dei parametri di fitting set(handles.e_ksl1,'String','') [p,ErrorEst]=polyfit(r,l,1);
set(handles.e_ksl1,'String',num2str(p(1))) DM(1,14,gg)=p(1);
% Valutazione del fitting pop_fit=polyval(p,r,ErrorEst);
% Valutazione del fit e dell'errore di predizione [pop_fit,delta] = polyval(p,r,ErrorEst);
Metodo di Sholl Log-Log nel sistema di riferimento a cerchi costanti
% --- Executes on button press in b_loglog1.
function b_loglog1_Callback(hObject, eventdata, handles) % hObject handle to b_loglog1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global rmin;
global rmax;
global Intersezioni1;
global Rsl1;
global N;
global gg;
% Logaritmo del numero di intersezione per area del cerchio in funzione del logaritmo del raggio
s=(rmax-rmin)/9; r=rmin:s:rmax;
y=Intersezioni1./(pi*(r.^2));
% Calcolo del coefficiente di correlazione set(handles.e_rll1,'String','') l=log10(y) TF = isinf(l) for i=1:length(TF) if TF(i)==1 l(i)=[ ] r(i)=[ ] end end C1=corrcoef(log10(r),l); Rll1=-C1(1,2);
set(handles.e_rll1,'String',num2str(Rll1)) DM(1,17,gg)=Rll1;
% Calcolo parametri fitting set(handles.e_kll1,'String','') [p,ErrorEst]=polyfit(log10(r),l,1);
set(handles.e_kll1,'String',num2str(p(1))) DM(1,16,gg)=p(1);
% Valutazione del fitting
pop_fit=polyval(p,log10(r),ErrorEst);
% Valutazione del fit e dell'errore di predizione [pop_fit,delta] = polyval(p,log10(r),ErrorEst); % Calcolo del determination ratio
set(handles.e_delta1,'String','') delta1=(Rsl1^2)/(Rll1^2);
set(handles.e_delta1,'String',num2str(delta1)) DM(1,18,gg)=delta1;
Calcolo del percorso dall’estremità al centro, dei vettori delle lunghezze
minime e degli angoli tra i vettori nel sistema di riferimento a cerchi costanti
% --- Executes on button press in b_percestr1.
function b_percestr1_Callback(hObject, eventdata, handles) % hObject handle to b_percestr1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global scheletro; global xc; global yc; global rmax; global rmin; global SO1; global Intersezioni1; global rmax; global Lmine1; global ange1; global DM; global N; global gg; global ax; global ay; [ro,c]=find(1-scheletro); l=length(ro); rm=zeros(1,l); for i=1:l rm(i)=sqrt(((xc-c(i))^2)+((yc-ro(i))^2)); end; [rmax,v] = max(rm); ax=c(v); ay=ro(v); axes(handles.a_immagine); imshow(1-SO1);
title(handles.a_immagine,sprintf('Foto numero %s',num2str(gg))) % L’edit viene inizializzato a zero
set(handles.e_percestr1,'String','') [m,n]=size(scheletro)
B=zeros(size(scheletro));
% Viene creata una matrice di tutti zero delle dimensioni dell'immagine L=zeros(size(scheletro));
s=(rmax-rmin)/9; indice=0;
% Si memorizzano le coordinate di tutti i pixel di intersezione for r=rmin:s:rmax indice=indice+1; for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); [ro,c,v]=find(T>1); R{indice}=ro(1:length(v)); C{indice}=c(1:length(v)); B=zeros(size(scheletro)); end; for r=rmin:s:rmax for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); end;
% Viene creato un array di zeri di lunghezza pari al numero di cerchi diminuito di uno dove mettere le lunghezze minime
Lmine1=zeros(1,10); a=zeros(1,10);
% Viene creato un array di zeri di lunghezza pari al numero di cerchi dova mettere gli angoli tra i vettori delle lunghezze minime
ange1=zeros(1,9); P=0;
indice=indice-1; f=length(R{indice}); l=zeros(1,f);
% Vengono calcolate le distanze tra i pixel di intersezione su due cerchi consecutivi e prendo la minima.
for j=1:f
l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2))
end;
if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k) by=R{indice}(k) else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2)); by=ay+round(60/sqrt(2)); end; end; Lmine1(indice+1)=lmin; P=P+lmin;
% Le lunghezze minime vengono rappresentate sull'immagine ponendo a 1 i pixel di L che rispettano l'equazione di una retta passante per i pixel di intersezione.
% Viene calcolato inoltre l'angolo che ciascun vettore lunghezza forma con l'orizzontale come arcotangente del coefficiente angolare della retta if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); while indice>1 ax=bx; ay=by; indice=indice-1; f=length(R{indice}); l=zeros(1,f); for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end; [lu,k]=min(l) if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k) by=R{indice}(k) else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2)); by=ay+round(60/sqrt(2)); end; end; Lmine1(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)) ; end; ax=bx; ay=by; lmin=sqrt(((ax-xc)^2)+((ay-yc)^2)); Lmine1(indice)=lmin; P=P+lmin; if ax==xc for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,xc):0.01:max(ax,xc) y=round((((yc-ay)/(xc-ax))*x)+((ay*xc-ax*yc)/(xc-ax))); L(y,round(x))=1; end; end; a(indice)= atand((yc-ay)/(xc-ax));
% Calcolo degli angoli compresi tra due segmenti consecutivi
% N.B. : se il prolungamento è a sinistra l'angolo viene preso positivo
for j=1:length(ange1) if a(j)>0 & a(j+1)>0 ange1(j)= a(j+1)-a(j); elseif a(j)<0 & a(j+1)<0 ange1(j)=-a(j+1)-a(j); elseif a(j+1)<0 & a(j)>0
ange1(j)=180-(-a(j+1)+a(j)); elseif a(j+1)>0 & a(j)<0
ange1(j)= 180-(a(j+1)-a(j)); end;
end;
imshow(1-(L+T));
title(handles.a_immagine,sprintf('Foto numero %s Percorso estremità nel primo sistema di riferimento',num2str(gg)))
set(handles.e_percestr1,'String',num2str(P)); DM(1,19,gg)=P;
DM(1,20:29,gg)=Lmine1; DM(1,30:38,gg)=ange1;
Calcolo del percorso dall’estremità dell’asse principale al centro, dei vettori
delle lunghezze minime e degli angoli tra i vettori nel sistema di riferimento
a cerchi costanti
% --- Executes on button press in b_percasse1.
function b_percasse1_Callback(hObject, eventdata, handles) % hObject handle to b_percasse1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO1; global Intersezioni1; global rmax; global Lmina1; global anga1; global DM; global N; global gg;
% La stessa cosa che è stata fatta prendendo come estremo l'estremità della cellula viene fatto prendendo come estremo il pixel più distante dal centro sull'asse principale
axes(handles.a_immagine); imshow(1-SO1);
title(sprintf('Foto numero %s Determina l''estremità dell''asse principale',num2str(gg))) L=zeros(size(scheletro)); B=zeros(size(scheletro)); s=(rmax-rmin)/9 [m,n]=size(scheletro); set(handles.e_percasse1,'String','') indice=0; for r=rmin:s:rmax
indice=indice+1;
for teta=0:2*pi/3600:2*pi
x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); [ro,c,v]=find(T>1); R{indice}=ro(1:length(v)); C{indice}=c(1:length(v)); B=zeros(size(scheletro)); end; for r=rmin:s:rmax for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); end;
% Con il clic del mouse viene selezionata l'estremità dell'asse principale
[xa,ya,but]=ginput(1);
if but==3 return end
% Come indice di partenza viene preso quello corrispondente al cerchio di
% distanza appena inferiore alla distanza del punto di estremità dell'asse principale rispetto al centro
dist=sqrt(((xa-xc)^2)+((ya-yc)^2))-rmin; indice=ceil(dist/s); Lmina1=zeros(1,indice+1); a=zeros(1,indice+1); anga1=zeros(1,indice); P=0; ax=xa; ay=ya; f=length(R{indice}); l=zeros(1,f);
for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end; [lu,k]=min(l); if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k) by=R{indice}(k) else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2)); by=ay+round(60/sqrt(2)); end; end; Lmina1(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); while indice>1 ax=bx; ay=by; indice=indice-1; f=length(R{indice}); l=zeros(1,f); for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end; [lu,k]=min(l); if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k) by=R{indice}(k) else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2)); by=ay+round(60/sqrt(2)); end; end; Lmina1(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); end; ax=bx; ay=by; lmin=sqrt(((ax-xc)^2)+((ay-yc)^2)); Lmina1(indice)=lmin; P=P+lmin; if ax==xc for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,xc):0.01:max(ax,xc) y=round((((yc-ay)/(xc-ax))*x)+((ay*xc-ax*yc)/(xc-ax))); L(y,round(x))=1; end; end; a(indice)=atand((yc-ay)/(xc-ax)); for j=1:length(anga1) if a(j)>0 & a(j+1)>0 anga1(j)= a(j+1)-a(j);
elseif a(j)<0 & a(j+1)<0 anga1(j)=-a(j+1)-a(j); elseif a(j+1)<0 & a(j)>0
anga1(j)=180-(-a(j+1)+a(j)); elseif a(j+1)>0 & a(j)<0
anga1(j)= 180-(a(j+1)-a(j)); end;
end;
axes(handles.a_immagine); imshow(1-(L+T));
title(handles.a_immagine,sprintf('Foto numero %s Percorso asse principale nel primo sistema di riferimento',num2str(gg)))
set(handles.e_percasse1,'String',num2str(P)); DM(1,39,gg)=P; Lmina1b=zeros(1,10) Lmina1b(1:length(Lmina1))=Lmina1 DM(1,40:49,gg)=Lmina1b; anga1b=zeros(1,10); anga1b(1:length(anga1))=anga1; DM(1,50:59,gg)=anga1b;
Costruzione del sistema di riferimento a distanza inter-cerchio costante
% --- Executes on button press in b_cerchi2.
function b_cerchi2_Callback(hObject, eventdata, handles) % hObject handle to b_cerchi2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO2; global gg; [m,n]=size(scheletro); B=zeros(size(scheletro)); SO2=zeros(size(scheletro)); SO2=SO2+(1-scheletro);
s=60; % La distanza inter-cerchio viene fissata
for r=rmin:s:rmax
for teta=0:2*pi/3600:2*pi
x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; SO2=SO2+B; end; axes(handles.a_immagine); imshow(1-SO2);
title(handles.a_immagine,sprintf('Foto numero %s Secondo sistema di riferimento',num2str(gg)))
axis equal; axis tight;
Calcolo delle intersezioni nel sistema di riferimento a distanza inter-cerchio
costante
% --- Executes on button press in b_intersezioni2.
function b_intersezioni2_Callback(hObject, eventdata, handles) % hObject handle to b_intersezioni2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO; global Intersezioni2; global indice; global DM; global N; global gg; set(handles.l_intersezioni2,'Value',1); set(handles.l_intersezioni2,'String',''); [m,n]=size(scheletro); B=zeros(size(scheletro)); s=60; indice=0; for r=rmin:s:rmax indice=indice+1; for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); for i=1:m; for j=1:n if T(i,j)==2; T(i,j)=1;
else T(i,j)=0; end end end; [L,num] = bwlabel(T,8); B=zeros(size(scheletro)); Int(indice)=num; Intersezioni2=Int; end; for i=1:(length(Intersezioni2)-1) if Intersezioni2(i)==0 for j=i+1:(length(Intersezioni2)-1) if Intersezioni2(j)>0 Intersezioni2(i)=1 end end end end if Intersezioni2(length(Intersezioni2))==0 Intersezioni2(length(Intersezioni2))=1 end for indice=1:(length(Intersezioni2)) lista=get(handles.l_intersezioni2,'String'); lista{indice}=Intersezioni2(indice); set(handles.l_intersezioni2,'Value',1); set(handles.l_intersezioni2,'String',lista);
end
% Calcolo del numero massimo di intersezioni [Nm2,i]=max(Intersezioni2);
set(handles.e_nmax2,'String',num2str(Nm2));
% Calcolo dell raggio del cerchio corrispondente al numero massimo di % intersezioni(raggio critico)
r=[rmin:s:rmax]; rc2=r(i);
set(handles.e_rcritico2,'String',num2str(rc2));
% Calcolo dell'indice di ramificazione di Schoenen (rapporto tra il numero massimo di intersezioni e il numero di dentriti primari) dp2=Intersezioni2(1);
S2=Nm2/dp2;
set(handles.e_schoenen2,'String',num2str(S2)); Intersezioni2b=zeros(1,20); Intersezioni2b(1:length(Intersezioni2))=Intersezioni2; DM(1,60:79,gg)=Intersezioni2b; DM(1,80,gg)=rc2; DM(1,81,gg)=Nm2; DM(1,82,gg)=S2;
Metodo di Sholl lineare nel sistema di riferimento a distanza inter-cerchio
costante
% --- Executes on button press in b_lineare2.
function b_lineare2_Callback(hObject, eventdata, handles) % hObject handle to b_lineare2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global rmin;
global rmax;
global Intersezioni2;
% Numero di intersezione per area del cerchio in funzione del raggio s=60; r=rmin:s:rmax y=Intersezioni2./(pi*(r.^2)); figure plot(r,y,'o')
Metodo di Sholl Semi-Log nel sistema di riferimento a distanza inter-cerchio
costante
% --- Executes on button press in b_semilog2.
function b_semilog2_Callback(hObject, eventdata, handles) % hObject handle to b_semilog2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global rmin; global rmax; global Intersezioni2; global Rsl2; global DM; global N; global gg;
% Logaritmo del numero di intersezione per area del cerchio in funzione del raggio
s=60;
r=rmin:s:rmax;
y=Intersezioni2./(pi*(r.^2));
%Calcolo del coefficiente di correlazione set(handles.e_rsl2,'String','')
TF = isinf(l) for i=1:length(TF) if TF(i)==1 l(i)=[ ] r(i)=[ ] end end C1=corrcoef(r,l); Rsl2=-C1(1,2);
set(handles.e_rsl2,'String',num2str(Rsl2)) DM(1,84,gg)=Rsl2;
% Calcolo dei parametri del fitting set(handles.e_ksl2,'String','') [p,ErrorEst]=polyfit(r,l,1);
set(handles.e_ksl2,'String',num2str(p(1))) DM(1,83,gg)=p(1);
% Valutazione del fitting pop_fit=polyval(p,r,ErrorEst);
% Valutazione del fit e dell'errore di predizione [pop_fit,delta] = polyval(p,r,ErrorEst);
Metodo di Sholl Semi-Log nel sistema di riferimento a distanza inter-cerchio
costante
% --- Executes on button press in b_loglog2.
function b_loglog2_Callback(hObject, eventdata, handles) % hObject handle to b_loglog2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global rmin; global rmax; global Intersezioni2; global Rsl2; global DM; global N; global gg;
% Logaritmo del numero di intersezione per area del cerchio in funzione del logaritmo del raggio
r=rmin:s:rmax;
y=Intersezioni2./(pi*(r.^2));
%Calcolo del coefficiente di correlazione set(handles.e_rll2,'String','') l=log10(y) TF = isinf(l) for i=1:length(TF) if TF(i)==1 l(i)=[ ] r(i)=[ ] end end C1=corrcoef(log10(r),l); Rll2=-C1(1,2);
set(handles.e_rll2,'String',num2str(Rll2)) DM(1,86,gg)=Rll2;
% Calcolo dei parametri del fitting set(handles.e_kll2,'String','') [p,ErrorEst]=polyfit(log10(r),l,1);
set(handles.e_kll2,'String',num2str(p(1))) DM(1,85,gg)=p(1);
% Valutazione del fitting
pop_fit=polyval(p,log10(r),ErrorEst);
% Valutazione del fit e dell'errore di predizione [pop_fit,delta] = polyval(p,log10(r),ErrorEst); %Calcolo del determination ratio
set(handles.e_delta2,'String','') delta2=(Rsl2^2)/(Rll2^2);
set(handles.e_delta2,'String',num2str(delta2)) DM(1,87,gg)=delta2;
Calcolo del percorso dall’estremità dell’asse al centro, dei vettori delle
lunghezze minime e degli angoli tra i vettori nel sistema di riferimento a
distanza inter-cerchio costante
% --- Executes on button press in b_percestr2.
function b_percestr2_Callback(hObject, eventdata, handles) % hObject handle to b_percestr2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO2; global Intersezioni1; global rmax; global Lmine2; global ange2; global DM; global N; global gg; global ax; global ay; [ro,c]=find(1-scheletro); l=length(ro); rm=zeros(1,l); for i=1:l rm(i)=sqrt(((xc-c(i))^2)+((yc-ro(i))^2)); end; [rmax,v] = max(rm); ax=c(v); ay=ro(v); axes(handles.a_immagine); imshow(1-SO2);
title(sprintf('Foto numero %s',num2str(gg))) set(handles.e_percestr2,'String','') [m,n]=size(scheletro); B=zeros(size(scheletro)); L=zeros(size(scheletro)); s=60; indice=0;
for r=rmin:s:rmax indice=indice+1; for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); [ro,c,v]=find(T>1); R{indice}=ro(1:length(v)); C{indice}=c(1:length(v)); B=zeros(size(scheletro)); end; for r=rmin:s:rmax for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; T=B+(1-scheletro); end; a=zeros(1,indice+1); Lmine2=zeros(1,indice+1); ange2=zeros(1,indice); P=0; indice=indice-1; f=length(R{indice}); l=zeros(1,f); for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end [lu,k]=min(l); if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k); by=R{indice}(k); else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2)); by=ay+round(60/sqrt(2)); end; end; Lmine2(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); while indice>1 ax=bx; ay=by; indice=indice-1; f=length(R{indice}); l=zeros(1,f); for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end; [lu,k]=min(l); if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k); by=R{indice}(k); else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2));
by=ay+round(60/sqrt(2));
end;
Lmine2(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.1:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); end; ax=bx; ay=by; lmin=sqrt(((ax-xc)^2)+((ay-yc)^2)); Lmine2(indice)=lmin; P=P+lmin; if ax==xc for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,xc):0.01:max(ax,xc) y=round((((yc-ay)/(xc-ax))*x)+((ay*xc-ax*yc)/(xc-ax))); L(y,round(x))=1; end; end; a(indice)= atand((yc-ay)/(xc-ax)); for j=1:length(ange2) if a(j)>0 & a(j+1)>0
ange2(j)= a(j+1)-a(j); elseif a(j)<0 & a(j+1)<0 ange2(j)=-a(j+1)-a(j); elseif a(j+1)<0 & a(j)>0
ange2(j)=180-(-a(j+1)+a(j)); elseif a(j+1)>0 & a(j)<0
ange2(j)= 180-(a(j+1)-a(j)); end;
end;
axes(handles.a_immagine); imshow(1-(L+T));
title(handles.a_immagine,sprintf('Foto numero %s Percorso estremità nel secondo sistema di riferimento',num2str(gg)))
figure
imshow(1-(L+T));
title(sprintf('Foto numero %s Percorso estremità nel secondo sistema di riferimento',num2str(gg)))
set(handles.e_percestr2,'String',num2str(P)); DM(1,88,gg)=P;
Lmine2b=zeros(1,20);
DM(1,89:108,gg)=Lmine2b; ange2b=zeros(1,20);
ange2b(1:length(ange2))=ange2; DM(1,109:128,gg)=ange2b;
Calcolo del percorso dall’estremità dell’asse al centro, dei vettori delle
lunghezze minime e degli angoli tra i vettori nel sistema di riferimento a
distanza inter-cerchio costante
% --- Executes on button press in b_percasse2.
function b_percasse2_Callback(hObject, eventdata, handles) % hObject handle to b_percasse2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global xc; global yc; global rmax; global rmin; global SO2; global Intersezioni1; global rmax; global Lmina2; global anga2; global DM; global N; global gg; axes(handles.a_immagine); imshow(1-SO2);
title(sprintf('Foto numero %s Determina l''estremità dell''asse principale',num2str(gg))) L=zeros(size(scheletro)); B=zeros(size(scheletro)); s=60; [m,n]=size(scheletro) set(handles.e_percasse2,'String','') indice=0; for r=rmin:s:rmax indice=indice+1; for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1;
end; end; end; [m,n]=size(B) T=B+(1-scheletro); [ro,c,v]=find(T>1); R{indice}=ro(1:length(v)); C{indice}=c(1:length(v)); B=zeros(size(scheletro)); end; for r=rmin:s:rmax for teta=0:2*pi/3600:2*pi x=round(r*cos(teta))+round(xc); y=round(r*sin(teta))+round(yc); if x>0 & x<n
if y>0 & y<m B(y,x)=1; end; end; end; [m,n]=size(scheletro) T=B+(1-scheletro); end; [xa,ya,but]=ginput(1); if but==3 return end dist=sqrt(((xa-xc)^2)+((ya-yc)^2))-rmin; indice=ceil(dist/s); Lmina2=zeros(1,indice+1); a=zeros(1,indice+1); anga2=zeros(1,indice); P=0; ax=xa; ay=ya; f=length(R{indice}); l=zeros(1,f); for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end; [lu,k]=min(l); if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k); by=R{indice}(k); else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2)); by=ay+round(60/sqrt(2)); end; end; Lmina2(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); while indice>1 ax=bx; ay=by; indice=indice-1; f=length(R{indice}); l=zeros(1,f); for j=1:f l(j)=sqrt(((ax-(C{indice}(j)))^2)+((ay-(R{indice}(j)))^2)); end; [lu,k]=min(l); if lu<sqrt((120*rmin)+(8200*indice)-3600) lmin=lu; bx=C{indice}(k) by=R{indice}(k) else lmin=60;
if ax<n/2 && ay<m/2
bx=ax+round(60/sqrt(2)); by=ay+round(60/sqrt(2));
elseif ax<n/2 && ay>m/2
bx=ax+round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay>m/2
bx=ax-round(60/sqrt(2)); by=ay-round(60/sqrt(2));
elseif ax>n/2 && ay<m/2
bx=ax-round(60/sqrt(2));
by=ay+round(60/sqrt(2));
end; Lmina2(indice+1)=lmin; P=P+lmin; if ax==bx for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,bx):0.01:max(ax,bx) y=round((((by-ay)/(bx-ax))*x)+((ay*bx-ax*by)/(bx-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((by-ay)/(bx-ax)); end; ax=bx; ay=by; lmin=sqrt(((ax-xc)^2)+((ay-yc)^2)); Lmina2(indice)=lmin; P=P+lmin; if ax==xc for y=min(ay,by):0.01:max(ay,by) L(round(y),round(x))=1; end; else for x=min(ax,xc):0.01:max(ax,xc) y=round((((yc-ay)/(xc-ax))*x)+((ay*xc-ax*yc)/(xc-ax))); L(y,round(x))=1; end; end; a(indice+1)=atand((yc-ay)/(xc-ax)); for j=1:length(anga2) if a(j)>0 & a(j+1)>0
anga2(j)= a(j+1)-a(j); elseif a(j)<0 & a(j+1)<0 anga2(j)=-a(j+1)-a(j); elseif a(j+1)<0 & a(j)>0
anga2(j)=180-(-a(j+1)+a(j)); elseif a(j+1)>0 & a(j)<0
anga2(j)= 180-(a(j+1)-a(j)); end;
end;
axes(handles.a_immagine); imshow(1-(L+T));
title(handles.a_immagine,sprintf('Foto numero %s Percorso asse principale nel secondo sistema di riferimento',num2str(gg)))
figure
imshow(1-(L+T));
title(sprintf('Foto numero %s Percorso asse principale nel secondo sistema di riferimento',num2str(gg)))
set(handles.e_percasse2,'String',num2str(P)); DM(1,129,gg)=P;
Lmina2b(1:length(Lmina2))=Lmina2; DM(1,130:149,gg)=Lmina2b; anga2b=zeros(1,20); anga2b(1:length(anga2))=anga2; DM(1,150:169,gg)=anga2b;
Calcolo dell’estensione
% --- Executes on button press in b_estensione.
function b_estensione_Callback(hObject, eventdata, handles) % hObject handle to b_estensione (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro;
global DM;
global N;
global bw;
global gg;
% L'edit viene inizializzato a zero set(handles.e_estensione,'String','') axes(handles.a_immagine);
imshow(scheletro);
title(sprintf('Foto numero %s Seleziona il centro per determinare l''estensione radiale',num2str(gg)))
axis equal; axis tight; axis off;
% Per avere una maggiore precisione nella determinazione dell'estensione radiale il centro viene selezionato con il clic del mouse per tre volte [xc1,yc1,but]=ginput(1); [xc2,yc2,but]=ginput(1); [xc3,yc3,but]=ginput(1); if but==3 return end [ro,c]=find(1-scheletro);
% Viene calcolata la distanza tra ciascun centro e i pixel dello scheletro, si trova la massima, e si fa la media delle tre distanze massime l=length(ro); rm=zeros(1,l); for i=1:l rm(i)=sqrt(((xc1-c(i))^2)+((yc1-ro(i))^2)); end;
rmax1=max(rm); for i=1:l rm(i)=sqrt(((xc2-c(i))^2)+((yc2-ro(i))^2)); end; rmax2=max(rm); for i=1:l rm(i)=sqrt(((xc3-c(i))^2)+((yc3-ro(i))^2)); end; rmax3=max(rm); D=(rmax1+rmax2+rmax3)/3;
set(handles.e_estensione,'String',num2str(D)); DM(1,170,gg)=D;
Calcolo dell’area del soma
% --- Executes on button press in b_soma.
function b_soma_Callback(hObject, eventdata, handles) % hObject handle to b_soma (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global foto;
global DM;
global N;
global gg;
% L'edit viene inizializzato a zero set(handles.e_soma,'String','') axes(handles.a_immagine); imshow(foto);
title(handles.a_immagine,sprintf('Foto numero %s Determina gli assi del soma',num2str(gg)))
axis equal; axis tight; axis off;
% Con il clic del mouse vengono individuate le estremità degli assi dell'ellisse che approssima il soma
[xa1,ya1,but]=ginput(1); % estremità destra asse minore [xa2,ya2,but]=ginput(1); % estremità sinistra asse minore [xb1,yb1,but]=ginput(1); % estremità superiore asse maggiore [xb2,yb2,but]=ginput(1); % estremità inferiore asse maggiore
if but==3 return end
% Calcolo della lunghezza degli assi a=(sqrt(((xa1-xa2)^2)+((ya1-ya2)^2)))/2; b=(sqrt(((xb1-xb2)^2)+((yb1-yb2)^2)))/2; % Calcolo dell'area dell'ellisse
A=pi*a*b;
set(handles.e_soma,'String',num2str(round(A))); DM(1,171,gg)=A;
Calcolo dell’angolo del cono
% --- Executes on button press in b_retta1.
function b_retta1_Callback(hObject, eventdata, handles) % hObject handle to b_retta1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro; global DM; global N; global h; global xv; global yv; global angle; global gg;
% L'edit viene inizializzato a zero set(handles.e_cono,'String','') axes(handles.a_immagine); imshow(scheletro) axis equal; axis tight; axis off;
% Il vertice del cono viene individuato con il clic del mouse axes(handles.a_immagine);
imshow(scheletro);
title(handles.a_immagine,sprintf('Foto numero %s Individua l''angolo del cono in cui è racchiusa la cellula',num2str(gg)))
axis equal; axis tight; axis off;
[xv,yv,but]=ginput(1);
if but==1
h = imline(gca,[xv 100], [yv 100]); % Costruzione della prima direttrice del cono
b_retta2_Callback(hObject, eventdata, handles); % Viene richiamata la callback retta2
elseif but==3 % Se si clicca con il tasto destro significa che la cellula si estende in tutte le direzioni per cui l'angolo del cono viene posto uguale a 360°
angle=360;
set(handles.e_cono,'String',num2str(angle)) DM(1,172,gg)=angle;
end;
% --- Executes on button press in b_retta2.
function b_retta2_Callback(hObject, eventdata, handles) % hObject handle to b_retta2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global h; global h1; axis equal; axis tight; axis off; api = iptgetapi(h); pos=api.getPosition()
h1 = imline(gca,[pos(1,1) 100], [pos(1,2) 100]); % Costruzione della seconda direttrice del cono
pause(10)
b_cono_Callback(hObject, eventdata, handles); % --- Executes on button press in b_cono.
function b_cono_Callback(hObject, eventdata, handles) % hObject handle to b_cono (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global h; global h1; global N; global angle; api = iptgetapi(h1); pos1=api.getPosition(); api = iptgetapi(h); pos=api.getPosition();
% Calcolo dell’angolo del cono utilizzando il teorema di Carnot l1=sqrt(((pos(2,1)-pos(1,1))^2)+(pos(2,2)-pos(1,2))^2);
l2=sqrt(((pos1(2,1)-pos1(1,1))^2)+(pos1(2,2)-pos1(1,2))^2); l3=sqrt(((pos(2,1)-pos1(2,1))^2)+(pos(2,2)-pos1(2,2))^2); angle=(acos(((l1^2)+(l2^2)-(l3^2))/(2*l1*l2)))*(180/pi); set(handles.e_cono,'String',num2str(angle))
Calcolo della dimensione frattale
% --- Executes on button press in b_box.
function b_box_Callback(hObject, eventdata, handles) % hObject handle to b_box (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global scheletro;
global N;
global me;
global gg;
global fine;
% Gli edit e la listbox vengono inizializzati a zero set(handles.e_inizio,'String','') set(handles.e_fine,'String','') set(handles.e_dimfratt,'String',''); set(handles.l_df,'Value',1); set(handles.l_df,'String',''); axes(handles.a_immagine); axis equal; axis tight; axis off; imshow(scheletro)
title(handles.a_immagine,sprintf('Foto numero %s',num2str(gg)))
% Utilizzando l’algoritmo del box-counting slope si determina la dimensione frattale
figure
[n,r] = boxcount(scheletro,'slope'); df = -diff(log(n))./diff(log(r));
title(sprintf('Foto numero %s Boxcount',num2str(gg)))
for indice =1:length(df)
elenco=get(handles.l_df,'String'); elenco{indice}=df(indice);
set(handles.l_df,'Value',1);
set(handles.l_df,'String',elenco);
end;
w=waitforbuttonpress;
if w==0;
inizio=str2num(get(handles.e_inizio,'String')); % Selezione degli estremi
dell’intervallo di linearità
fine=str2num(get(handles.e_fine,'String'));
me=mean(df(inizio:fine)); % Calcolo della dimensione frattale come media nell’intervallo di linearià
s=std(df(inizio:fine)); % Calcolo della deviazione standard della misura della dimensione frattale
set(handles.e_dimfratt,'String',sprintf('%g +/- %g',me,s))
end;
Costruzione del data-matrix globale relativo alle cellule
di Purkinje
DMg=zeros(25,178,17); DMg(1:13,:,5:11)=DM1(:,:,1:7); DMg(1:13,:,13)=DM1(:,:,8); DMg(1:13,:,15)=DM1(:,:,9); DMg(1:13,:,17)=DM1(:,:,10); DMg(14:25,:,1:9)=DM2(:,:,1:9); DMg(14:25,:,11)=DM2(:,:,10);save('datamatrix.mat','DMg','-mat')
Estrazione delle variabili o funzioni di interesse dal
data-matrix globale relativo alle cellule di Purkinje
clear all
clc
load datamatrix.mat;
% Si sceglie la variabile o funzione da graficare var=input('Variabile o funzione: ','s');
% Si sceglie se visualizzare un grafico statico o dinamico tipo=input('Digita g per giorno e t per tempo: ','s');
elseif strcmp('Intersezioni2',var)==1 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula);
giorno= input('Giorno: ', 's'); g=str2num(giorno); g=1; while g<24 rmax=DMg(cell,175,g); rmin=DMg(cell,174,g); s=60; r1=rmin:s:rmax; u=DMg(cell,60:79,g)~= zeros(1,20,1); z=find(u); if length(z)~=0 ind=find(DMg(cell,60:79,g)); Intersezioni=DMg(cell,60:60+max(ind)-1,g); figure r=rmin:s:r1(max(ind))
plot(r,Intersezioni,'o')
,
title(['Sistema di rif. cerchio cost.: IntersezioniCellula',num2str(cell), ' Giorno',num2str(g)]) xlabel('r'); ylabel('Intersezioni'); saveas(gcf,sprintf('Intersezioni2%s_%s.bmp',num2s tr(cell),num2str(g)),'bmp') end g=g+1; end
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
end
elseif strcmp('Intersezioni2Lineare',var)==1 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula); g=1; while g<24 s=60; rmax=DMg(cell,175,g); rmin=DMg(cell,174,g); r=rmin:s:rmax; u=DMg(cell,60:79,g)~= zeros(1,20,1); z=find(u); if length(z)~=0 ind=find(DMg(cell,60:79,g)); c=DMg(cell,60:60+max(ind)-1,g); y=c(1:length(r))./(pi*(r.^2));
[xFit yFit yError y0 A lambda x0 sFormula] = myFitLogRS(r, y, 1000, 'none');
figure plot(r,y,'o') hold on plot(xFit,yFit) xlabel('r'); ylabel('Intersezioni/Area');
title(['Sistema di rif. distanza inter-cerchio cost. : Metodo Lineare Cellula',num2str(cell),
' Giorno',num2str(g)]) saveas(gcf,sprintf('Intersezioni2Lineare%s_%s.bm p',num2str(cell),num2str(g)),'bmp') end g=g+1; end
save(sprintf('Formule%s.mat',num2str(cell),'F')) reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
end
elseif strcmp('Intersezioni2Semi-Log',var)==1 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula); g=1; while g<24 s=60; rmax=DMg(cell,175,g); rmin=DMg(cell,174,g); r=rmin:s:rmax; u=DMg(cell,60:79,g)~= zeros(1,20,1); z=find(u); if length(z)~=0 ind=find(DMg(cell,60:79,g)); c=DMg(cell,60:60+max(ind)-1,g); y=c(1:length(r))./(pi*(r.^2)); [p,ErrorEst]=polyfit(r,log10(y),1); pop_fit=polyval(p,r,ErrorEst); [pop_fit,delta] = polyval(p,r,ErrorEst)
% Plot dei dati, del fit e degli intervalli di confidenza
figure
plot(r,log10(y),'+',r,pop_fit,'g',r,pop_fit+2*delta ,'r:',r,pop_fit-2*delta,'r:');
title(['Sistema di rif. distanza inter-cerchio cost.: Metodo Semi-Log Cellula',num2str(cell),
' Giorno',num2str(g)]) xlabel('r'); ylabel('log(Intersezioni/Area)'); saveas(gcf,sprintf('Intersezioni2Semi-Log%s_%s.bmp', num2str(cell),num2str(g)),'bmp') end g=g+1; end
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
elseif strcmp('Intersezioni2Log-Log',var)==1 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula); g=1; while g<24 s=60; rmax=DMg(cell,175,g); rmin=DMg(cell,174,g); r=rmin:s:rmax; u=DMg(cell,60:79,g)~= zeros(1,20,1); z=find(u); if length(z)~=0 ind=find(DMg(cell,60:79,g)); c=DMg(cell,60:60+max(ind)-1,g); y=c(1:length(r))./(pi*(r.^2)); [p,ErrorEst]=polyfit(log10(r),log10(y),1); pop_fit=polyval(p,log10(r),ErrorEst); [pop_fit,delta] = polyval(p,log10(r),ErrorEst) % Plot dei dati, del fit e degli intervalli di
confidenza
figure
plot(log10(r),log10(y),'+',log10(r),pop_fit,'g', log10(r),pop_fit+2*delta,'r:',log10(r),
pop_fit-2*delta,'r:');
title(['Sistema di rif. distanza inter-cerchio cost.: Metodo Log-Log Cellula',num2str(cell),'
Giorno',num2str(g)]) xlabel('log(r)'); ylabel('log(Intersezioni/Area)'); saveas(gcf,sprintf('Intersezioni2Log-Log%s_%s.bmp', num2str(cell),num2str(g)),'bmp') end g=g+1; end
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
end
elseif strcmp('Delta2',var)==1 for g=7:23 for i=1:25 v(i)= DMg(i,87,g); end for j=1:length(v) if v(j)==0 v(j)=NaN; end; end;
figure, plot(v,'*'),title(['Sistema di rif. distanza inter-cerchio cost.: Valore di Delta per tutte le cellule
Giorno',num2str(g)]) xlabel('Cellula') ylabel('\Delta')
x=1:0.1:25; y=1;
hold on
plot(x,y,'r--')
saveas(gcf,sprintf('Deltacellule_%s.bmp',num2str(g)),'bmp') end
elseif strcmp('Lminasse2',var)==1 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula); g=1; a=zeros(1,23); while g<24 u=DMg(cell,130:149,g)~= zeros(1,20,1); z=find(u); if length(z)~=0 ind=find(DMg(cell,130:149,g)) c=DMg(cell,130:130+max(ind)-1,g) mas=max(c(2:length(c)-1)) mini=min(c(2:length(c)-1)) a(g)=mas-mini; figure plot(c(2:length(c)-1));axis([2 length(c)-1 0 80]) title({'Sistema di rif. distanza inter-cerchio
cost.:';['Lunghezze minime sull''asse principale Cellula',num2str(cell),' Giorno',num2str(g)]}) xlabel('Cerchio')
ylabel('Lunghezze minime')
saveas(gcf,sprintf('Lminasse%s_%s.bmp',num2str(cell) ,num2str(g)),'bmp') end g=g+1; end for j=1:length(a) if a(j)==0 a(j)=NaN; end; end; if cell<14 x=17:2:23; y=a(17:2:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); a=cat(2,a(1:17),y1(2:length(y1))); else if ~isnan(a(17)) x=15:2:17; y=a(15:2:17); x1=15:1:17; y1 =interp1(x,y,x1,'spline'); a(15:17)=y1; end end plot(1:23,a,'-o')
title({'Sistema di rif. distanza inter-cerchio
cost.:';['Indice di tortuosità Cellula',num2str(cell)]}) xlabel('t')
ylabel('\alpha')
saveas(gcf,sprintf('alfa%s_%s.bmp',num2str(cell), num2str(g)),'bmp')
hold on
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
end
elseif strcmp('Aasse2',var)==1 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula); g=1; while g<24 u=DMg(cell,150:169,g)~= zeros(1,20,1); z=find(u); if length(z)~=0 ind=find(DMg(cell,150:169,g)); c=DMg(cell,150:150+max(ind)-1,g); figure plot(2:length(c)-1,c(2:length(c)-1)); axis([2 length(c)-1 min(2:length(c)-1) max(2:length(c)-1)])
figure plot(c);
title({'Sistema di rif. distanza inter-cerchio cost.:';['Angoli sull''asse principale al centro Cellula',num2str(cell),' Giorno',num2str(g)]}) xlabel('Cerchio')
ylabel('Angoli')
saveas(gcf,sprintf('Aasse%s_%s.bmp',num2str(cell), num2str(g)),'bmp')
end
g=g+1; end
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
end
elseif strcmp('Box-counting',var)==1 reply='Y';
while strcmp('Y',reply)==1
coltura= input('Coltura 01 o 02: ', 's') cellula= input('Cellula: ', 's')
cell=str2num(cellula)
fileFolder = fullfile('C:','Documents and Settings','Utente',
'Desktop','ProgMatlab','SOFTWARE_PURKINJE','Immagini',sprintf('C oltura%s',coltura),sprintf('%s%s',coltura,cellula));
dirOutput = dir(fullfile(fileFolder,'s_*.bmp')); fileNames = {dirOutput.name}' nu=numel(fileNames); addpath(fileFolder) for i=1:nu scheletro1=imread(fileNames{i}); S = char(fileNames{i}); [a b gg d] = strread(S, '%s %s %d %d', 'delimiter', '_'); level = graythresh(scheletro1); scheletro = im2bw(scheletro1,level); imshow(scheletro) figure cd('C:\Documents andSettings\Utente\Desktop\ProgMatlab\ SOFTWARE_PURKINJE') [n, r] = boxcount(scheletro);
loglog(r, n,'bo-', r, (r/r(end)).^(-2), 'r--') xlabel('r')
ylabel('n(r)')
legend('actual box-count','space-filling box-count'); title(['Box-counting Giorno ',num2str(d)])
saveas(gcf,sprintf('Box-counting_%s_%s.bmp', char(b),num2str(d)),'bmp')
figure
[n,r] = boxcount(scheletro,'slope');
title(['Box-counting slope Giorno ',num2str(d)]) saveas(gcf,sprintf('Box-countingslope_%s_%s.bmp', char(b),num2str(d)),'bmp')
end
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's'); end cd('C:\Documents andSettings\Utente\Desktop\ProgMatlab\ SOFTWARE_PURKINJE')
elseif strcmp('Dimensione frattale',var)==1 for g=7:23 for i=1:25 v(i)= DMg(i,173,g); end for j=1:length(v) if v(j)==0 v(j)=NaN; end; end;
figure, plot(v,'*'),title(['Sistema di rif. cerchi cost.: Dimensione frattale di tutte le cellule Giorno',num2str(g)]) xlabel('Cellula')
ylabel('Dimensione Frattale') x1=1:0.1:25;
y1=1.94; hold on
plot(x1,y1,'r--') x2=1:0.1:25; y2=2;
plot(x2,y2,'r--')
saveas(gcf,sprintf('DimFrattcellule_%s.bmp',num2str(g)),'bmp') end
end
elseif strcmp('g', tipo)==0 reply='Y';
while strcmp('Y',reply)==1
cellula= input('Cellula da 1 a 25: ', 's'); cell=str2num(cellula); if strcmp('Intersezioni1',var)==1 Int1t=zeros(10,23); for j=1:10 for i=1:23 Int1t(j,i)=DMg(cell,j,i); if Int1t(j,i)==0; Int1t(j,i)=NaN; end end end if cell<14 for i=1:10 x=17:2:23; y=Int1t(i,17:2:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); Int1t(i,:)=cat(2,Int1t(i,1:17),y1(2:length(y1))); end else if ~isnan(Int1t(17)) x=15:2:17; y=Int1t(15:2:17); x1=15:1:17; y1 =interp1(x,y,x1,'spline'); Int1t(15:17)=y1; end end figure
plot(1:1:23,Int1t'),title(['Sistema di rif. cerchi costanti: Andamento delle intersezioni nel tempo
Cellula',num2str(cell)])
legend('cerchio1','cerchio2','cerchio3','cerchio4',
'cerchio5','cerchio6','cerchio7','cerchio8','cerchio9',
'cerchio10','Location','EastOutside') grid on
xlabel('t')
ylabel('Intersezioni')
elseif strcmp('Nm2 medio',var)==1 v=zeros(25,23); for j=1:25 for i=1:23 v(j,i)= DMg(j,81,i); if v(j,i)==0; v(j,i)=NaN; end end end n=nanmean(v); x=17:23; y=n(17:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); n=cat(2,n(1:17), y1(2:length(y1))); x=1:23; E = nanstd(n)*ones(size(x));
figure,errorbar(x,n,E,'-o'),title('Sistema di riferimento distanza inter-cerchio costante: Andamento di Nm
medio'),axis([1 23 min(n) max(n)]) xlabel('t')
ylabel('Nm')
saveas(gcf,sprintf('Nm2t_%s.bmp',cellula,'bmp'))
elseif strcmp('ksl2 medio',var)==1 v=zeros(25,23); for j=1:25 for i=1:23 v(j,i)= DMg(j,83,i); if v(j,i)==0; v(j,i)=NaN; end end end n=nanmean(v); x=17:23; y=n(17:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); n=cat(2,n(1:17),y1(2:length(y1))); x=1:23; E = nanstd(n) *ones(size(x));
figure,errorbar(x,n,E,'o'),title('Sistema di riferimento distanza inter-cerchio costante: Andamento di ksl
medio'),axis([1 23 min(n) max(n)]) xlabel('t')
ylabel('ksl')
elseif strcmp('Estensione media',var)==1 v=zeros(25,23); for j=1:25 for i=1:23 v(j,i)= DMg(j,170,i); if v(j,i)==0; v(j,i)=NaN; end end end n=nanmean(v); x=17:23; y=n(17:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); n=cat(2,n(1:17),y1(2:length(y1))); x=1:23; E = nanstd(n) *ones(size(x));
figure,errorbar(x,n,E,'o'),title(' Andamento dell'' Estensione media nel tempo'),axis([1 23 min(n) max(n)]) xlabel('t')
ylabel('ksl')
saveas(gcf,sprintf('ksl2t_%s.bmp',cellula,'bmp'))
elseif strcmp('Passe2 medio',var)==1 v=zeros(25,23); for j=1:25 for i=1:23 v(j,i)= DMg(j,129,i); if v(j,i)==0; v(j,i)=NaN; end end end n=nanmean(v); x=17:23; y=n(17:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); n=cat(2,n(1:17),y1(2:length(y1))); x=1:23; E = nanstd(n) *ones(size(x));
figure,errorbar(x,n,E,'o'),title('Andamento del Percorso sull''asse medio nel tempo'),axis([1 23 min(n) max(n)]) xlabel('t')
ylabel('ksl')
elseif strcmp('Area Soma',var)==1 v=zeros(1,23); for i=1:23 v(i)= DMg(cell,171,i); end for j=1:length(v) if v(j)==0 v(j)=NaN; end; end; if cell<14 x=17:2:23; y=v(17:2:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); v=cat(2,v(1:17),y1(2:length(y1))); else if ~isnan(v(17)) x=15:2:17; y=v(15:2:17); x1=15:1:17; y1 =interp1(x,y,x1,'spline'); v(15:17)=y1; end end
figure,plot(1:23,v,'-o'),axis([1 23 0 max(v)]) title(['Andamento dell''area del soma nel tempo Cellula',num2str(cell)])
xlabel('t')
ylabel('Area Soma')
saveas(gcf,sprintf('AreaSomat_%s.bmp',cellula),'bmp')
elseif strcmp('Angolo Cono',var)==1 v=zeros(1,23); for i=1:23 v(i)= DMg(cell,172,i); end for j=1:length(v) if v(j)==0 v(j)=NaN; end; end; if cell<14 x=17:2:23; y=v(17:2:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); v=cat(2,v(1:17),y1(2:length(y1))); else if ~isnan(v(17)) x=15:2:17; y=v(15:2:17); x1=15:1:17; y1 =interp1(x,y,x1,'spline'); v(15:17)=y1; end end
figure,plot(1:23,v,'-o'),axis([1 23 0 max(v)]) title(['Andamento dell''angolo del cono nel tempo
Cellula',num2str(cell)]) xlabel('t')
ylabel('Angolo cono')
saveas(gcf,sprintf('AngoloConot_%s.bmp',cellula),'bmp')
elseif strcmp('Delta2 medio',var)==1 v=zeros(25,23); for j=1:25 for i=1:23 v(j,i)= DMg(j,87,i); if v(j,i)==0; v(j,i)=NaN; end end end n=nanmean(v); x=17:23; y=n(17:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); n=cat(2,n(1:17),y1(2:length(y1))); x=1:23; E = nanstd(n) *ones(size(x));
figure,plot(x,n,'-o'),title(' Andamento di Delta nel tempo'),axis([1 23 0.5 1.5])
xlabel('t') ylabel('\Delta')
saveas(gcf,sprintf('Deltat_%s.bmp',cellula,'bmp')) elseif strcmp('Dimensione frattale media',var)==1 v=zeros(25,23); for j=1:25 for i=1:23 v(j,i)= DMg(j,173,i); if v(j,i)==0; v(j,i)=NaN; end end end n=nanmean(v); x=17:23; y=n(17:23); x1=17:1:23; y1 =interp1(x,y,x1,'spline'); n=cat(2,n(1:17),y1(2:length(y1))); x=1:23; E = nanstd(n)*ones(size(x));
figure,plot(x,n,'-o'),title(' Andamento della Dimensione Frattale nel tempo'),axis([1 23 1.5 2.5])
xlabel('t') ylabel('Df')
saveas(gcf,sprintf('Dft_%s.bmp',cellula,'bmp')) end
reply= input('Vuoi vedere la variabile per un''altra cellula Y/N:', 's');
end end
Algoritmi organizzati nella GUI per l’estrazione delle
variabili dalle immagini delle reti di neuroni
mesencefalici
Caricamento delle immagini ed avvio della GUI
% --- Executes on button press in b_carica.
function b_carica_Callback(hObject, eventdata, handles) % hObject handle to b_carica (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
global im_original; global N; global nu; global DM; global Adiac; global B; global Rag; rete=get(handles.e_rete,'String');
fileFolder = fullfile('C:','Documents and
Settings','Utente','Desktop','ProgMatlab','SOFTWARE_RETI',rete) dirOutput = dir(fullfile(fileFolder,'f_*.bmp')) fileNames = {dirOutput.name}' nu=numel(fileNames); addpath(fileFolder) DM=zeros(1,163,7); for N=1:nu im_original=imread(fileNames{N}); axes(handles.a_immagine); imshow(im_original); axis equal; axis tight; axis off;
w=0;
while w == 0 pause(8)
b_elaborazione1_Callback(hObject, eventdata, handles); b_rilevamento_Callback(hObject, eventdata, handles); b_raggiungibilita_Callback(hObject, eventdata, handles); w = waitforbuttonpress;
end
w = waitforbuttonpress;
if w == 0
b_grado_Callback(hObject, eventdata, handles); b_connmedia_Callback(hObject, eventdata, handles); b_distanze_Callback(hObject, eventdata, handles); b_distribuzione_Callback(hObject, eventdata, handles); b_lmedia_Callback(hObject, eventdata, handles);
b_clustering_Callback(hObject, eventdata, handles); b_crandom_Callback(hObject, eventdata, handles); b_lrandom_Callback(hObject, eventdata, handles); b_lregolare_Callback(hObject, eventdata, handles); b_test_Callback(hObject, eventdata, handles);
end;
end;
Selezione del tipo di immagine visualizzata
% --- Executes on selection change in pop_immagine.
function pop_immagine_Callback(hObject, eventdata, handles) % hObject handle to pop_immagine (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns pop_immagine contents as cell array
% contents{get(hObject,'Value')} returns selected item from pop_immagine
str = get(hObject, 'String'); val = get(hObject,'Value');
switch str{val}
case 'Foto' % Immagine originale global im_original; axes(handles.a_immagine); imshow(im_original); axis equal; axis tight; axis off;
case 'Livelli di grigio' % Immagine in livelli di grigio global im_original; global lg; lg = rgb2gray(im_original); axes(handles.a_immagine); imshow(lg); axis equal; axis tight; axis off;
case 'Elaborata' % Immagine elaborata
global BWfinal; L=bwlabel(BWfinal,8); axes(handles.a_immagine); imshow(L,[]); axis equal; axis tight; axis off;
case 'Labeld' % Immagine segmentata global RGB; axes(handles.a_immagine); imshow(RGB) axis equal; axis tight; axis off; end;