• Non ci sono risultati.

APPENDICE B Algoritmi in Matlab

N/A
N/A
Protected

Academic year: 2021

Condividi "APPENDICE B Algoritmi in Matlab"

Copied!
71
0
0

Testo completo

(1)

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);

(2)

% 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);

(3)

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');

(4)

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;

(5)

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;

(6)

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);

(7)

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;

(8)

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

(9)

[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);

(10)

% 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;

(11)

% 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;

(12)

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;

(13)

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;

(14)

% 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;

(15)

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;

(16)

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;

(17)

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

(18)

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);

(19)

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;

(20)

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));

(21)

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);

(22)

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;

(23)

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;

(24)

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','')

(25)

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

(26)

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;

(27)

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;

(28)

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));

(29)

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;

(30)

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);

(31)

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;

(32)

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;

(33)

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));

(34)

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;

(35)

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;

(36)

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

(37)

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);

(38)

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();

(39)

% 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;

(40)

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');

(41)

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.: Intersezioni

Cellula',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');

(42)

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');

(43)

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')

(44)

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')

(45)

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)

(46)

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

(47)

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')

(48)

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')

(49)

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')

(50)

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

(51)

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')

(52)

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;

(53)

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

(54)

% 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;

Riferimenti

Documenti correlati

Conclusion Social justice as relational equality requires setting stringent limits to distributive inequality: it recognises both intrinsic reasons of justice in favour of

Le imprese dell’ultimo cerchio, quello delle industrie correlate, non appartengono al settore ICC perché non utilizzano come input di produzione la cultura e la

Questa foto è stata scattata nel 2000, quindi molto più recente rispetto alle altre, e si può infatti notare come cambia ciò che vuole trasmetterci l’autore: di

Si pensi, in riferimento alle strutture della comunità (e alle sue spalle alla riflessione ecclesiologica), alla profonda differenza tra le chiese, per quel che riguarda

We need more attention to the ways in which public policy address- es women’s needs in uneven ways; sustained critique of work-care-migration regimes that neglect the actual labor

The fifth national R&amp;D plan— the Research, Innovation and Enterprise 2015 Plan (RIE2015) (2011–15)—espoused, for the first time, differentiated open innova- tion

We analyze the conflict of interests for Disability Determination Services agencies between Social Security Administration SSA standards and state gubernatorial political