• Non ci sono risultati.

Fase di pre–processing

3.5 Descrizione dell’algoritmo di segmentazione

3.5.1 Fase di pre–processing

Le tre cartilagini del ginocchio (femorale, tibiale e rotulea) vengono segmentate singolarmente tramite altrettante funzioni scritte in ambiente MATLAB; tali funzioni hanno bisogno di alcuni parametri in ingresso che vengono forniti da una prima elaborazione delle immagini.

Dopo aver eseguito l’accesso, da MATLAB, alla cartella relativa al soggetto in esame, bisogna innanzitutto invocare la funzione openFiles.m (Appendice A) che legge tutti i file DICOM nella cartella (è necessario che l’utente digiti a schermo le iniziali o il formato dei file che intende aprire), li ordina per nome e li assegna ad una matrice (sequence). La funzione restituisce anche il numero di slice dell’acquisizione.

La matrice risultante avrà tre dimensioni: le prime due indicano la gran- dezza della matrice di acquisizione (1024x1024), mentre la terza corrisponde al numero di fette acquisite. Accedendo, quindi, ad ogni singolo elemento della matrice possiamo visualizzare l’immagine di ogni singola fetta. Questo ci servirà poiché l’algoritmo di segmentazione prevede, come sappiamo, un approccio slice–by–slice.

A questo punto è necessario accedere alla matrice sequence tramite l’ap- plicazione VideoViewer (inclusa nell’Image Processing Toolbox) che consente la visualizzazione di sequenze di immagini. Per ciascuna cartilagine bisogna individuare delle slice di riferimento prese secondo i seguenti criteri (il motivo di queste scelte verrà discusso nel Paragrafo 3.5.3):

• Cartilagine femorale:

– MIN, corrisponde alla prima fetta in cui è visibile la cartilagine; – MAX, corrisponde all’ultima fetta in cui è visibile la cartilagine; – CENTRO, individua la fetta dove la cartilagine si restringe maggior-

mente prima di allargarsi nuovamente;

– FIRST CENTER, corrisponde alla fetta, compresa tra MIN e CENTRO, in cui la cartilagine ricopre una superficie maggiore;

– SECOND CENTER, come FIRST CENTER ma compresa tra CENTRO e MAX.

• Cartilagine tibiale:

– MINL, corrisponde alla prima fetta in cui è visibile la cartilagine tibiale laterale;

– MAXL, corrisponde all’ultima fetta in cui è visibile la cartilagine tibiale laterale;

– CENTROL, corrisponde alla fetta, compresa tra MINL e MAXL, in cui la cartilagine ricopre una superficie maggiore;

– MINM, corrisponde alla prima fetta in cui è visibile la cartilagine tibiale mediale;

– MAXM, corrisponde all’ultima fetta in cui è visibile la cartilagine tibiale mediale;

– CENTROM, come CENTROL ma compresa tra MINM e MAXM. • Cartilagine rotulea:

– MINR, corrisponde alla prima fetta in cui è visibile la cartilagine; – MAXR, corrisponde all’ultima fetta in cui è visibile la cartilagine; – CENTROR, corrisponde alla fetta, compresa tra MINR e MAXR, in cui

la cartilagine ricopre una superficie maggiore.

Questi sono gli unici parametri, insieme alla matrice sequence, che vanno forniti in ingresso agli algoritmi di segmentazione. Termina, così, la fase di pre–processing che non necessita di ulteriori accorgimenti.

3.5.2 La funzione activecontour

All’interno dell’Image Processing Toolbox di MATLAB troviamo la funzione activecontourche rappresenta il fulcro dell’algoritmo qui sviluppato. Questa funzione viene chiamata tramite l’istruzione

bw = activecontour (A, mask, n, method, Name, Value)

che segmenta l’immagine A in due regioni (oggetto e sfondo) usando il metodo dei contorni attivi. I bordi della regione individuata da mask (un’immagine binaria) definiscono la posizione del contorno di partenza la cui evoluzione permetterà la segmentazione dell’oggetto di interesse. L’output bw è un’im- magine binaria dove l’oggetto è rappresentato in bianco e lo sfondo in nero. Gli altri parametri in ingresso sono tutti opzionali:

• n = numero massimo di iterazioni per l’evoluzione del contorno (se non è specificato, la funzione utilizza n = 100). L’algoritmo può anche fermarsi prima se la posizione del contorno nell’iterazione corrente è uguale a quella trovata in una delle cinque iterazioni precedenti. Inoltre, se il contorno iniziale (specificato da mask) è lontano dal contorno effettivo dell’oggetto da segmentare, si raccomanda di utilizzare un numero di iterazioni anche maggiore di 100;

• method = specifica il metodo dei contorni attivi utilizzato per la seg- mentazione, Chan–Vese (basato sullo studio di Chan e Vese [8]) o edge (basato sul metodo presentato da Caselles et al. [7]). Per ottenere una segmentazione accurata con il metodo edge, si raccomanda di utilizzare un contorno di partenza che giaccia fuori dai bordi dell’oggetto poiché questo metodo tende a contrarre iterativamente il contorno. Al contra- rio, con il metodo Chan–Vese il contorno è libero sia di contrarsi che di espandersi a seconda delle caratteristiche dell’immagine. Ciò nono- stante, se l’oggetto da segmentare presenta zone con diverse intensità di livelli di grigio, il metodo Chan–Vese potrebbe non essere in grado di segmentare correttamente;

• Name-Value = permette di specificare coppie di argomenti dove Name è il nome dell’argomento e Value è il valore corrispondente. Si possono specificare anche più coppie di argomenti separandole tra loro da una virgola. Gli argomenti che possono essere scelti sono i seguenti:

– SmoothFactor = definisce il grado di smoothing dei bordi della regione segmentata. Il valore da associare a questo argomento deve essere un numero positivo: valori alti portano ad un maggiore smoothing del contorno (e questo potrebbe anche tagliare fuori i dettagli più fini), mentre valori bassi producono più irregolarità ma includono anche maggiori dettagli. I valori utilizzati dalla funzione (laddove non vengano specificati dall’utente) sono 0 per il metodo Chan–Vese e 1 per il metodo edge;

– ContractionBias = specifica la tendenza ad espandere o a far col- lassare verso l’interno il contorno. Il valore da associare a questo argomento è un numero tipicamente compreso tra −1 e 1, dove i valori positivi influenzano la contrazione del contorno mentre quelli negativi lo forzano ad espandersi. È importante tenere presente che questo parametro non garantisce la contrazione o la dilatazione del contorno: può capitare che i bordi tendano ad andare verso l’esterno nonostante si sia scelto un valore positivo, tuttavia quest’ultimo fa in modo che la dilatazione risulti molto più lenta. I valori utilizzati dalla funzione (laddove non vengano specificati dall’utente) sono 0 per il metodo Chan–Vese e 0.3 per il metodo edge.

Per tutte le segmentazioni delle cartilagini effettuate in questo lavoro di tesi sono stati impostati gli stessi parametri, scelti a seguito di diverse prove effettuate su alcune slice; nello specifico, il numero n di iterazioni per l’evoluzione del contorno è stato scelto pari a 20, ed è stato utilizzato l’edge (vedi Figura 3.11) come metodo dei contorni attivi (con SmoothFactor = 1 e

Figura 3.11: Confronto tra due segmentazioni della cartilagine femorale nella stessa immagine utilizzando i due diversi metodi dei contorni attivi proposti dalla funzione activecontour. In (a) viene visualizzata l’immagine originale senza segmentazione, in (b) la segmentazione ottenuta con il metodo edge e in (c) quella ottenuta con il metodo Chan–Vese. I parametri SmoothFactor e ContractionBias sono gli stessi per entrambe le segmentazioni (1 e 0 rispettivamente).

La documentazione della funzione activecontour specifica, inoltre, che per ottenere risultati più veloci e più accurati bisognerebbe tracciare il contorno di partenza nelle vicinanze dei bordi dell’oggetto di interesse. A tal proposito si faccia riferimento alla Figura 3.12 che mette a confronto due segmentazioni della cartilagine femorale (per semplicità la cartilagine viene segmentata su una singola slice) ottenute con due diverse maschere di partenza, una sul bordo dell’oggetto e l’altra molto distante da esso. La difficoltà dell’algoritmo nel raggiungere i bordi effettivi della cartilagine quando il contorno di partenza è lontano risiede nelle diverse intensità di livelli di grigio presenti non solo all’interno del tessuto cartilagineo, ma anche nei diversi tessuti del ginocchio; questo rende molto più complicata la ricerca dei punti di discontinuità dei livelli di grigio (punti di edge) relativi ai bordi effettivi della cartilagine.

3.5.3 Fase di segmentazione

Con la scelta dei parametri in ingresso per la funzione activecontour è possibile spiegare anche i criteri di selezione delle slice utilizzati nella fase di pre–processing descritta nel Paragrafo 3.5.1. Il metodo edge ricerca i bordi dell’oggetto di interesse all’interno del contorno di partenza, quindi tende naturalmente a contrarsi (il valore 0 assegnato al parametro ContractionBias rallenta in parte questo processo). Pertanto, se disegnassimo il contorno di partenza sulla prima immagine in cui è visibile la cartilagine, otterremmo sicu- ramente una buona segmentazione per l’immagine corrente, ma nel procedere con la fetta successiva ci ritroveremmo con un contorno di partenza che giace all’interno della struttura di interesse (dal momento che quest’ultima copre una superficie maggiore della precedente), e questo ci porterebbe ad ottenere delle segmentazioni sempre più sottili e frammentate che non combaciano con la struttura vera e propria della cartilagine (vedi Figura 3.13), rendendo

Figura 3.12: Confronto fra due segmentazioni della cartilagine femorale ottenute sulla stessa immagine ma utilizzando contorni iniziali differenti. In (b) troviamo il risultato della segmentazione utilizzando 20 iterazioni della funzione activecontour partendo da un contorno iniziale molto vicino alla struttura di interesse (a), mentre (d) rappresenta il risultato ottenuto dopo 400 iterazioni partendo da un contorno più lontano (c).

necessario, così, un nuovo intervento dell’utente che dovrà disegnare un con- torno per ogni singola slice. Nelle ultime fette dell’acquisizione, però, quando la cartilagine ricopre una superficie sempre più piccola fino a non essere più visibile, i contorni ottenuti su un’immagine includeranno sicuramente anche quelli dell’immagine successiva, e l’algoritmo può procedere senza ulteriori interventi da parte dell’utente (vedi Figura 3.14).

Figura 3.13: Risultati della segmentazione della cartilagine femorale partendo da un contorno iniziale disegnato sull’immagine (a) che viene fatto evolvere, senza alcun intervento da parte dell’utente, nella direzione in cui l’area della cartilagine cresce. In (b) e (c) sono rappresentati i risultati ottenuti dopo, rispettivamente, 10 e 20 fette dall’immagine di partenza.

Figura 3.14: Risultati della segmentazione della cartilagine femorale partendo da un contorno iniziale disegnato sull’immagine (a) che viene fatto evolvere, senza alcun intervento da parte dell’utente, nella direzione in cui l’area della cartilagine diminuisce. In (b) e (c) sono rappresentati i risultati ottenuti dopo, rispettivamente, 5 e 10 fette dall’immagine di partenza.

La scelta delle slice di riferimento nella fase di pre–processing è una diretta conseguenza di questo tipo di problema: è innanzitutto necessario selezionare quelle immagini, all’interno di ogni singola acquisizione, in cui le tre cartilagini presentano la superficie minima e massima, per poi partire da queste e proseguire nella direzione in cui la superficie diminuisce. Pertanto, per le tre cartilagini del ginocchio vengono eseguiti i seguenti passi:

• Cartilagine femorale:

1. L’utente disegna il contorno iniziale sulla slice FIRST CENTER. Da qui l’algoritmo procede all’indietro, fetta dopo fetta, fino alla segmentazione della cartilagine contenuta in MIN;

2. L’algoritmo riparte dalla segmentazione ottenuta in FIRST CENTER per poi procedere in avanti verso la slice CENTRO;

3. All’utente viene richiesto di disegnare un nuovo contorno di parten- za sulla fetta identificata da SECOND CENTER. Da qui l’algoritmo procede all’indietro fino alla slice CENTRO+1;

4. L’algoritmo riparte dalla segmentazione ottenuta in SECOND CENTER per poi procedere in avanti verso MAX.

• Cartilagine tibiale:

1. L’utente disegna il contorno iniziale sulla slice CENTROL. Da qui l’algoritmo procede all’indietro fino alla segmentazione della carti- lagine contenuta in MINL;

2. L’algoritmo riparte dalla segmentazione ottenuta in CENTROL per poi procedere in avanti verso MAXL;

3. All’utente viene richiesto di disegnare un nuovo contorno di par- tenza sulla fetta indicata da CENTROM. Da qui l’algoritmo procede all’indietro fino ad arrivare a MINM;

4. L’algoritmo riparte dalla segmentazione ottenuta in CENTROM per poi procedere in avanti verso MAXM.

• Cartilagine rotulea:

1. L’utente disegna il contorno iniziale sulla slice CENTROR. Da qui l’algoritmo procede all’indietro fino alla segmentazione della carti- lagine contenuta in MINR;

2. L’algoritmo riparte dalla segmentazione ottenuta in CENTROR per poi procedere in avanti verso MAXR.

Con queste accortezze, l’utente sarà chiamato ad interagire con la funzione solo nei casi già elencati e qualora egli ritenga opportuno fornire una nuova maschera di partenza per migliorare il risultato della segmentazione. Può, infatti, capitare che i contorni seguano oggetti che non fanno parte della struttura in esame poiché questi presentano, a volte, punti di edge più “forti” e più vicini rispetto a quelli della cartilagine, e la funzione activecontour ne è naturalmente attratta.

Una volta stabiliti i parametri iniziali si può dare il via alla vera e propria segmentazione delle cartilagini articolari. La prima ad essere analizzata, invocando la funzione segFemorale.m (vedi Appendice B), è la cartilagine femorale; le segmentazioni delle altre due cartilagini si baseranno anche sui risultati forniti da tale funzione. Questa viene invocata dalla Command Window di MATLAB tramite l’istruzione

che restituisce la durata del processo di segmentazione (Tf) e una matrice contenente le maschere binarie di tutte le slice segmentate e non (bwf); in particolare, per quelle immagini in cui la cartilagine non è visibile, la maschera risulterà formata solo da zeri.

In ingresso la funzione richiede il numero di immagini della sequenza (numFrames), il numero massimo di iterazioni per l’evoluzione del contorno (numIteration) e il vettore contenente i numeri delle slice di riferimento

descritte in precedenza (R = [MIN,MAX,CENTRO,FIRSTC,SECONDC]).

La durata del processo di segmentazione viene calcolata tramite l’utilizzo dei comandi tic e toc forniti da MATLAB; il primo, inserito nella prima riga del codice della funzione, fa partire un cronometro che viene poi fermato dalla funzione toc (chiamata alla fine di tutto il processo di segmentazione) che restituisce il tempo trascorso dall’avvio.

Terminata la segmentazione della cartilagine femorale, si può passare ad analizzare la tibiale e la rotulea invocando, rispettivamente, le funzio- ni segTibiale.m e segRotulea.m (vedi Appendice B). Le istruzioni da Command Window sono le seguenti:

[Tt, bwt] = segTibiale(sequence,numFrames,numIteration,Rt,bwf)

[Tr, bwr] = segRotulea(sequence,numFrames,numIteration,Rr,bwf) dove Tt e Tr danno informazioni sulla durata dei rispettivi processi (e vengono calcolati come Tf) e bwt e bwr contengono i risultati della segmentazione. Anche in questo caso in ingresso abbiamo bisogno dei vettori contenenti le informazioni sulle slice di riferimento scelte in fase di pre–processing (Rt = [MINL,CENTROL,MAXL,MINM,CENTROM,MAXM] per la cartilagine tibiale,

Rr = [MINR,CENTROR,MAXR]per la rotulea).

L’utente è libero di scegliere quale delle due cartilagini segmentare per prima; l’unica condizione necessaria per entrambe è l’aver ottenuto la segmen- tazione della cartilagine femorale (bwf è tra i parametri in ingresso per tutte e due le funzioni). Bisogna, infatti, tenere in considerazione che quest’ultima presenta, in alcune slice, dei punti di contatto con le altre due, pertanto, per evitare problemi di sotto– o sovra–segmentazione che inficerebbero il calcolo dei volumi, è auspicabile, nelle immagini in cui sono visibili punti di contatto, che non ci siano zone in cui le segmentazioni di due cartilagini si sovrappon- gono (sovra–segmentazione) o zone in cui le maschere di segmentazione non si toccano (sotto–segmentazione).

Per far fronte a questo problema, ogni volta che l’utente è chiamato a disegnare un nuovo contorno di partenza, sull’immagine vengono sempre visualizzati i bordi della cartilagine femorale in modo che questi possano fornire una guida nel tracciare il contorno. Inoltre, è previsto un controllo (sia per la cartilagine rotulea che per la tibiale) su ogni segmentazione ottenuta: se un pixel di bwr (o di bwt) in una determinata slice appartiene già a bwf, il

valore di quel pixel diventa 0, in modo tale da eliminarlo nel conteggio totale dei pixel appartenenti all’oggetto di interesse. Con questo metodo vengono arginati i problemi di sovra–segmentazione.

Per i problemi relativi alla sotto–segmentazione, l’utente esegue una valutazione direttamente su ciascuna immagine in cui vengono visualizzati i contorni della cartilagine femorale e quelli ottenuti dalla segmentazione della cartilagine rotulea (o tibiale): per poter meglio apprezzare i dettagli è possibile ingrandire una qualsiasi zona dell’immagine in maniera interattiva ed osservare, così, se sono presenti aree della cartilagine in esame non comprese nei contorni segmentati. Se così fosse, l’utente ha la possibilità di scartare il risultato della segmentazione e disegnare un nuovo contorno di partenza.

In tutti i casi in cui è previsto che venga tracciato un nuovo contorno iniziale, tutte e tre le funzioni fin qui descritte permettono di ingrandire l’immagine corrente (ancora una volta in maniera interattiva) per meglio apprezzare i dettagli delle cartilagini articolari. Una volta raggiunto l’ingran- dimento desiderato, basterà premere un apposito pulsante posto all’interno della figura che si sta analizzando per poter procedere con il tracciamento del contorno.

Nella Figura 3.15 vengono mostrati i contorni delle tre cartilagini tro- vati tramite gli algoritmi proposti; l’immagine visualizzata fa parte del- l’acquisizione (con la sequenza 3D FIESTA–C) di uno dei soggetti sani analizzati.

Figura 3.15: Risultato ottenuto tramite gli algoritmi di segmentazione semi– automatici sviluppati in questo lavoro di tesi. In (a) si riporta l’imma- gine originale e in (b) l’immagine segmentata (in verde la cartilagine femorale, in blu la cartilagine tibiale e in rosso la cartilagine rotulea).

3.5.4 Fase di post–processing

Concluse le segmentazioni delle tre cartilagini del ginocchio, si può procedere con il calcolo dei loro volumi nella fase di post–processing. A tale scopo è stata implementata la funzione volumi.m (Appendice C) che viene chiamata tramite l’istruzione:

V = volumi(bwf, bwt, bwr, R, Rt, numFrames, C)

dove C è un vettore contenente le dimensioni del voxel (ricavate accedendo ai metadati delle immagini DICOM del soggetto in esame, Pixel Spacing e Spacing Between Slices), R e Rt sono i vettori già noti, e gli altri parametri in ingresso non sono altro che le matrici di immagini binarie risultanti dal processo di segmentazione per ciascuna cartilagine. V è un vettore tale che V = [Volume Femorale,

Volume Tibiale, Volume Rotulea,

Volume Femorale-Rotulea,

Volume Femorale-Tibiale Mediale, Volume Femorale-Tibiale Laterale, Volume Tibiale Mediale,

Volume Tibiale Laterale Volume totale]

Nello specifico, i primi tre valori indicano, rispettivamente, i volumi totali della cartilagine femorale, tibiale e rotulea, mentre Volume Femorale-Rotulea è il volume della cartilagine femorale sul versante rotuleo, Volume Femorale- Tibiale Mediale (Laterale) è il volume della cartilagine femorale sul versante tibiale mediale (laterale) e Volume Tibiale Mediale (Laterale) rappresenta il volume della cartilagine tibiale mediale (laterale). L’ultimo termine, Volume totale, è la somma dei volumi dei primi tre elementi del vettore. Per questi ultimi, il calcolo del volume viene effettuato moltiplicando il numero totale di pixel 6= 0 di ciascuna matrice binaria per le dimensioni del voxel. Ne risulta un volume espresso in mm3.

Gli altri cinque termini del vettore V, anch’essi espressi in mm3, vengono

calcolati a posteriori nel modo seguente:

• Volume Femorale-Rotulea: tra le slice MINR e MAXR si cerca quella in cui la cartilagine femorale ha un perimetro minore e si registrano le coordinate del pixel più in basso e all’estrema destra. Dal punto individuato in questo modo si fanno passare due piani, assiale e coronale, che dividono ciascuna immagine in quattro quadranti; di questi viene considerato solo il quadrante anteriore–superiore, che comprende il volume di cartilagine femorale sul versante rotuleo (vedi Figura 3.16).

Il calcolo del volume viene effettuato come spiegato in precedenza, ma con una nuova matrice di immagini binarie che comprende soltanto la regione anteriore–superiore tra MIN e MAX;

• Volume Femorale-Tibiale Mediale (Laterale): una volta definito il quadrante anteriore–superiore, per il calcolo del volume sul versante tibiale si considera la porzione di cartilagine femorale negli altri tre quadranti. La slice individuata nel trovare il perimetro minore della cartilagine femorale divide in due la matrice di immagini binarie (a cui è stata tolta la parte anteriore–posteriore), e su queste vengono calcolati i volumi della femorale sul versante tibiale mediale (se siamo nella regione in cui sono incluse le slice MINM e MAXM), o sul versante tibiale laterale (nella regione in cui sono incluse MINL e MAXL);

• Volume Tibiale Mediale (Laterale): il calcolo di questo volume viene effettuato comprendendo solo quelle slice tra MINM e MAXM (MINL e MAXL) che, per definizione, sono relative alla cartilagine tibiale mediale (laterale).

Figura 3.16: Visualizzazione del quadrante anteriore–superiore (in alto a sinistra) per il calcolo del volume della cartilagine femorale sul versante rotuleo.

Una tale suddivisione è utile soprattutto nello studio delle cartilagini dei soggetti affetti da artrosi: si possono mettere a confronto i dati ottenuti dall’acquisizione baseline e dai follow–up per stabilire quale porzione di cartilagine articolare risente maggiormente dei danni dell’artrosi. Inoltre questa suddivisione risulta utile anche per un’eventuale mappatura del T2

(vedi Paragrafo 3.2.1): analizzando il T2 di ogni singolo comparto, ed unendo

queste informazioni a quelle volumetriche, si può avere un quadro completo del progredire della patologia.

Figura 3.17: Risultato del processo di suddivisione dei volumi. In (a) si riporta l’immagine originale, in (b) l’immagine segmentata (in verde la cartila- gine femorale–tibiale laterale, in rosso la cartilagine rotulea, in blu la cartilagine tibiale laterale e in giallo la cartilagine femorale-rotulea).

Nella Figura 3.17 è mostrato il risultato del post–processing sui volumi, in cui viene evidenziata, su una singola slice, anche la porzione di cartilagine