Introduzione
In questa Appendice verranno riportati gli algoritmi realizzati in
MATLAB per l’esecuzione delle varie analisi.
Quelli riportati in verde sono i vari commenti presenti nel file,
inseriti attraverso il simbolo di percentuale.
Analisi della raggiungibilità e studio delle
distanze
%% ANALISI DELLA RAGGIUNGIBILITA' DELLE DISTANZE
% Tale programma consente la costruzione del grafo di raggiungibilità dei
% nodi e di calcolare la distanza tra di essi
%% Step 1: lettura e visualizzazione dell'immagine % Lettura e visualizzazione dell'immagine della rete neurale in vitro
% acquisita con la telecamera
J = imread('giorno7.bmp'); figure;
imshow(J);
title('Immagine originale');
%% Step 2: rilevamento nodi
% La matrice xy è inizialmente vuota
n = 0;
% I nodi vengono identificati cliccandoci sopra con il tasto sin del mouse
% Il clic con il tasto destro identifica l'ultimo punto
disp('Left mouse button picks points.')
disp('Right mouse button picks last point.') imshow(J,axes) hold on but = 1; while but == 1 [xi,yi,but] = ginput(1); plot(xi,yi,'mx'); text(xi+5,yi,num2str(n+1)); text(xi+5.0,yi+20,num2str(xi)); text(xi+5.0,yi+40.0,num2str(yi)); n = n+1;
xy(:,n) = [xi yi];
end
A=xy; B=A'
% ogni riga della matrice B riporta le coordinate X,Y di un nodo
% B è perciò una matrice nX2, dove n è il numero dei nodi
%% Step 3: Trasformazione dell'immagine RGB in immagine a livelli di grigio
% Per la conversione si usa il comando rgb2gray
I = rgb2gray(J); figure;
imshow(I);
title('Immagine a livelli di grigio');
%% Step 4: Rilevamento cellule
% Segmentazione: isolamento delle cellule
% Si sfrutta il differente livello di grigio rispetto al resto dell'immagine
% X realizzare la segmentazione si usa un operatore di bordo basato sul
% gradiente: operatore di Sobel, che coinvolge un pixel di un intorno 3x3
% Si realizza quindi la sogliatura per creare una maschera binaria
% contenente la cellula segmentata
[junk threshold] = edge(I, 'sobel'); fudgeFactor = 0.6;
% tale parametro deve essere opportunamente scelto a seconda dell'immagine
BWs = edge(I,'sobel', threshold * fudgeFactor); subplot(2,3,2)
imshow(BWs);
title('binary gradient mask');
%% Step 5: Dilatazione
% L'operazione di sogliatura ha consentito la selezione dei pixel
% caratterizzati da significativi cambiamenti di intensità.
% Vengono mostrate le linee di alto contrasto, che però possono non
% delineare abbastanza bene il contorno dell'oggetto di interesse.
% Ad esempio possono esservi "buchi" nelle linee che circondano
% l'oggetto nella maschera
% l'immagine è perciò sottoposta all'operatore morfologico di dilatazione
% Si usano elementi strutturali che possono essere creati con la funzione
% |strel|
se90 = strel('line', 3, 90); se0 = strel('line', 3, 0);
% Si usano elementi strutturali verticali seguiti da quelli orizzontali
% La funzione |imdilate| dilata l'immagine % Il contorno é mostrato abbastanza nettamente
BWsdil = imdilate(BWs, [se90 se0]); subplot(2,3,3)
imshow(BWsdil);
title('dilated gradient mask');
%% Step 6: Riempimento "Interior Gaps"
% Ci sono ancora piccole cavità all'interno della cellula e per riempirle
% si usa un altro operatore morfologico: imfill
BWdfill = imfill(BWsdil, 'holes'); subplot(2,3,4)
imshow(BWdfill);
title('binary image with filled holes');
%% Step 7: Smoothen
% Gli oggetti segmentati vengono resi più naturali rifinendoli erodendo
% l'immagine 2 volte con un "diamante" creato usando la funzione |strel|
seD = strel('diamond',1);
BWfinal = imerode(BWdfill,seD); BWfinal = imerode(BWdfill,seD); subplot(2,3,5)
imshow(BWfinal);
title('segmented image');
%% step 8: Divisione in regioni
% bwlabel marca i componenti connessi in un'immagine binaria
% 8 è la connettività scelta
X = bwlabel(BWfinal,8);
% il comando label2rgb converte la matrice label in una
% immagine a colori RGB, così da % visualizzare le regioni marcate
% A ciascun oggetto identificato è assegnato un colore
RGB = label2rgb(X,@jet,'k'); figure
imshow(RGB,axes)
title('labeled image'); hold on [l,m]=size(B); for k=1:l plot(B(k,1),B(k,2),'w*') text(B(k,1),B(k,2), num2str(k)); hold on end
%% Step 9 Costruzione della matrice di raggiungibilità
% La matrice di raggiungibilità è una matrice quadrata,
% di dimensione pari al num dei nodi individuati al passo 2
% Se il nodo i raggiunge il nodo j, allora l'elemento i,j
% della matrice è 1, diversamente 0
% 2 nodi sono connessi se appartengono allo stesso oggetto,
% ovvero se il pixel che li rappresenta ha gli stessi valori di R, G, B
C=B(:,1);
% ogni riga del vettore C rappresenta la coordinata x di un nodo
D=B(:,2);
% ogni riga del vettore D rappresenta la coordinata y di un nodo
[l,m]=size(B);
pixels = impixel(RGB,C,D)
% ogni riga di questa matrice riporta i valori R, G e B di un pixel, le cui
% coordinate sono specificate nella riga corrispondente della matrice B
R=zeros(l); for i=1:l for j=1:l if pixels(i,:)==pixels(j,:) R(i,j)=1; else R(i,j)=0;
end if i==j R(i,j)=0; end end end Rag=R
% Rag è la matrice di raggiungibilità
%% Step 10 Costruzione del grafo di raggiungibilità
BGobj = biograph(Rag) h=view(BGobj)
%% Step 11 Costruzione della matrice delle distanze % La matrice delle distanze è una matrice quadrata, % di dimensione pari al num dei nodi individuati al passo 2
% L'elemento i,j della matrice è la distanza euclidea tra il nodo i e il % nodo j dist=zeros(l); for i=1:l for j=1:l ai=B(i,1); bi=B(i,2); aj=B(j,1); bj=B(j,2); a=(ai-aj)^2; b=(bi-bj)^2; dist(i,j)=sqrt(a+b); if dist(i,j)< 10 dist(i,j)=0;
else dist(i,j)=dist(i,j); end
end end
Distanze=dist
Il fudgeFactor per la rete 1 è pari a:
9
giorno 1 = 0.46;
9
giorno 2 = 0.475;
9
giorno 3 = 0.51;
9
giorno 4 = 0.51;
9
giorno 5 = 0.6;
9
giorno 6= 0.65;
9
giorno 7 = 0.6.
I valori della rete 2 sono:
9
giorno 1 = 0.59;
9
giorno 2 = 0.5;
9
giorno 3 = 0.6;
9
giorno 4 = 0.61;
9
giorno 5 = 0.6;
9
giorno 6 = 0.748;
9
giorno 7 = 0.495.
I valori della rete 3 sono:
9
giorno 1 = 0.38;
9
giorno 2 = 0.5;
9
giorno 3 = 0.5;
9
giorno 4 = 0.45;
9
giorno 5 = 0.5;
9
giorno 6 = 0.55;
9
giorno 7 = 0.55.
Analisi della connettività e costruzione del grafo
Una volta ottenuta la matrice delle adiacenze, il vettore delle
connettività e la connettività media vengono calcolati
automaticamente dal programma scritto in Matlab, che consente
anche la costruzione automatica del grafo.
L’esempio riportato riguarda l’analisi della rete 1 al primo giorno di
coltura ed è ripetuta in maniera identica per tutti gli altri giorni e per
le altre due reti.
%% STUDIO DI CONNETTIVITA' %% Giorno 1
% Matrice delle adiacenze:
A1=[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
% l'elemento iesimo del vettore k1 é il grado del vertice i, ottenuto addizionando
% gli elementi della iesima colonna di A1
k1=sum(A1)
% k1m è la connettività media
k1m=mean(k1) % Costruzione istogramma x = 0:1:14; figure hist(k1,x) ylabel('frequenza') xlabel('connettività')
title('distribuzione della connettività dei nodi al giorno 1')
% Creazione del grafo
B1 = biograph(A1) h1=view(B1)
Analisi della distribuzione delle lunghezze del
cammino e calcolo della lunghezza media
Dall’immagine della rete è possibile valutare la lunghezza del
cammino tra 2 generici nodi i e j e costruire un vettore delle
distanze, in cui sono riportati tutti i valori: d12, d13,...
Naturalmente poi, nel vettore, d31, uguale a d13, non è ripetuta.
Tale vettore è stato inserito in un file di Matlab che, a partire da
esso, consente di calcolare sia la distribuzione delle lunghezze del
cammino che la lunghezza media data da:
∑
∑
= ≠ =−
=
N j ij N j i id
N
N
L
1 , 1)
1
(
1
dove N è il numero dei nodi.
Tale analisi è stata effettuata per tutte le 7 immagini di ogni rete, ma
di seguito, per brevità, è riportata l’analisi della rete 1 al primo
giorno di coltura. Ciò che cambia nei vari giorni sono solo gli
elementi del vettore e gli indici, ma i comandi sono gli stessi.
%% DISTRIBUZIONE DELLE LUNGHEZZE DEL CAMMINO E CALCOLO DELLA LUNGHEZZA MEDIA
% Ogni elemento del vettore è la distanza tra 2 nodi % E' inoltre calcolata la distanza media del cammino come media delle
% distanze tra le tutte le coppie di nodi
% 210 è il prodotto N*(N-1), dove N è il num dei nodi pari a 15 %% giorno1 l1=[1 3 2 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 2 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]; x = 0:1:5; figure hist(l1,x) ylabel('frequenza')
xlabel('lunghezza del cammino')
title('distribuzione della lunghezza del cammino al giorno 1')
% m1 è la lunghezza media del cammino al giorno 1