• Non ci sono risultati.

3.4 Estensione 3D

3.4.1 Calcolo segnale monogenico

Il segnale monogenico di un’immagine 3D a livelli di grigio è ottenuto dalla risposta a quattro filtri a quadratura sferica (SQFs) tridimensionali. E’ stato quindi sufficiente calcolare un filtro pari, scelto tra le varie famiglie di filtri disponibili, che avesse anche la terza dimensione, per poter efficacemente ottenere gli altri tre filtri dispari dalla sua trasformata di Riesz[25].

Bok(ω) = Rk(ω) · Be(ω), Rk(ω) = −jωk

|ω| (3.43)

dove ω = [ω1,ω2,ω3]T è la frequenza angolare normalizzata ed Rk(ω) è la trasfor-

mata di Riesz lungo la direzione k = {1, 2, 3}. Mentre nel caso bidimensionale, per facilitare i conti è stata adottata una rappresentazione complessa che tenesse conto dei due filtri, per il caso tridimensionale questa strada non è risultata essere praticabile. E’ stato quindi tenuto conto singolarmente dei filtraggi lungo le tre direzioni. Sono state così calcolate, allo stesso modo del 2D, le quattro risposte: quella al filtro pari p(x) e quelle ai tre filtri dispari q1(x), q2(x), q3(x). Come si può notare quindi, passando dalle

due alle tre dimensioni, le risposte ai filtri dispari non sono più due ma ben tre: ciò significa sostituire la singola orientazione monogenica con i due angoliθ1 eθ2per po-

ter definire la direzione di q(x) = [q1(x), q2(x), q3(x)]T, x= [x1, x2, x3]T nello spazio

tridimensionale (come si vede dalla Fig.3.4). Oltre alle risposte ai filtraggi, ne sono state calcolate anche le derivate lungo le tre dimensioni. Con tutto ciò a disposizio- ne, sono state ricavate le caratteristiche del segnale monogenico. Per quanto riguarda

Figura 3.4: La figura è suddivisa in due sottofigure. In a) si ha la rappresentazio- ne tradizionale dell’orientazione monogenica per le immagini 2D. In b) invece l’orientazione monogenica per i dati tridimensionali[25].

l’ampiezza, nessuna differenza con il caso 2D:

A(x) =

q

p2(x) + |q(x)|2 (3.44)

Si è passati quindi al calcolo delle due orientazioni:

θ1(x) = arctan €q 2(x) q1(x) Š , θ2(x) = arctan €s(x) q3(x) Š . (3.45) con s(x) = pq1(x)2+ q2(x)2. Con lo scopo di aumentare la robustezza dell’algoritmo,

la stima classica delle orientazioni (vedi eq.3.45) è sostituita con una ai minimi quadra- ti, ottenuta massimizzando il valore della trasformata di Hillbert direzionale mediata su un intorno locale νσ. Sapendo che il vettore n che relaziona le due orientazioni monogeniche è dato da:

il problema di ottimizzazione è risolto dall’autovettore associato al più grande autovalore della matrice 3x3 T(x), con le voci date da:

[T(x)]nm=

Z

νσ(x0− x)qn(x0)qm(x0)dx0 (3.47)

con n, m= {1, 2, 3}. Dai conti che ne derivano, sono state ricavate le due orientazioni:

θ1= arctan ¦([T] 22+[T]33)·[T]23+[T]13·[T]12 ([T]11+[T]33)·[T]13+[T]23·[T]12 © θ2 = arctan ¦ [T] 11+[T]22 ([T]13·sin(θ1)+[T]23cos(θ1)) © (3.48)

Dal punto di vista implementativo, tutto risulta uguale se non per qualche modifica. Infatti, mentre "conv2" può ricevere in ingresso vettori, "convn" non prevede questo tipo di funzionalità. Per poter realizzare questo tipo di operazione è stata quindi modificata la funzione "convn" già presente in ambiente Matlab, perchè fosse in grado di assumere in ingresso anche vettori e non solo matrici.

Per quanto riguarda invece la frequenza, non vi sono notevoli differenze se non una maggiore attenzione posta sul trattare le matrici nelle loro dimensioni e la moltiplica- zione per il nuovo vettore n dato da 3.46. Infatti la formula usata è stata la stessa del caso bidimensionale (vedi eq. 3.19). La fase ed il vettore di fase vengono ottenuti con le medesime formule (vedi eq. 3.16 e 3.14).

3.5

Optical Flow Multiscala

Come nel caso bidimensionale, il campo dello spostamento d(x) = [d1(x), d2(x), d3(x)]T

lungo x1, x2, x3 tra due frames successivi è stimato sostituendo l’assunzione della co-

stanza della luminosità con quella della fase monogenica. Ciò si traduce, dal punto di vista del vettore di fase r= [r1, r2, r3], in tali termini:

r(t + 1, x) = r(t, x − d) (3.49) , con l’assunzione di piccoli spostamenti ed espansione di Taylor al primo ordine, si ot- tiene r(t, x−d) = r(t, x)−J·d, dove J è la matrice Jacobiana di r. Le considerazioni fatte

e seguenti sono state le stesse del caso bidimensionale, riducendo il tutto ad una esten- sione delle matrici considerate. La matrice J infatti diventa J =

    r1x1 r1x2 r1x3 r2x1 r2x2 r2x3 r3x1 r3x2 r3x3     , dove ri x k= ∂x kri.

Per evitare che la scelta della dimensione della finestra w influenzi troppo l’algoritmo, come nel caso bidimensionale, è stato implementato un metodo che tenesse conto, oltre che della traslazione, anche della rotazione, espansione e compressione. Considerando per semplicità una finestra centrata in(x10, x20, x30) = (0, 0, 0), quello che ne risulta è che: d(x) = A(x)u A=     1 0 0 x1 x2 x3 0 0 0 0 0 0 0 1 0 0 0 0 x1 x2 x3 0 0 0 0 0 1 0 0 0 0 0 0 x1 x2 x3     (3.50) u= [d10, d20, d30, d1x1, d1x2, d1x3, d2x1, d2x2, d2x3, d3x1, d3x2, d3x3] (3.51)

Con operazioni di sostituzioni ed ottimizzazioni, quello che si ottiene è che b = Mu, con b= − < ATJTr

le loro voci M=                               r1x r1 y r1z x r1x y r1x z r1x x r1 y y r1 y z r1 y x r1z y r1z z r1z r2x r2 y r2z x r2x y r2x z r2x x r2 y y r2 y z r2 y x r2z y r2z z r2z r3x r3 y r3z x r3x y r3x z r3x x r3 y y r3 y z r3 y x r3z y r3z z r3z x r1x x r1 y x r1z x2r1x x y r1x xz r1x x2r1 y x y r1 y xz r1 y x2r1z x y r1z xz r1z y r1x y r1 y y r1z x y r1x y2r1x yz r1x x y r1 y y2r1 y yz r1 y x y r1z y2r1z yz r1z z r1x z r1 y z r1z xz r1x yz r1x z2r1x xz r1 y yz r1 y z2r1 y xz r1z yz r1z z2r1z x r2x x r2 y x r2z x2r2x x y r2x xz r2x x2r2 y x y r2 y xz r2 y x2r2z x y r2z xz r2z y r2x y r2 y y r2z x y r2x y2r2x yz r2x x y r2 y y2r2 y yz r2 y x y r2z y2r2z yz r2z z r2x z r2 y z r2z xz r2x yz r2x z2r2x xz r2 y yz r2 y z2r2 y xz r2z yz r2z z2r2z x r3x x r3 y x r3z x2r3x x y r3x xz r3x x2r3 y x y r3 y xz r3 y x2r3z x y r3z xz r3z y r3x y r3 y y r3z x y r3x y2r3x yz r3x x y r3 y y2r3 y yz r3 y x y r3z y2r3z yz r3z z r3x z r3 y z r3z xz r3x yz r3x z2r3x xz r3 y yz r3 y z2r3 y xz r3z yz r3z z2r3z                               (3.52) b= − h r1t r2t r3t x r1t x r2t x r3t y r1t y r2t y r3t z r1t z r2t z r3t i (3.53)

4

|

Elaborazione delle immagini

4.1

Preparazione delle immagini

Per poter verificare il funzionamento dell’algoritmo, è necessario disporre di un dataset di immagini ecocardiografiche catturate nel tempo da poter dare come input all’elaboratore. Estendendo il tutto al caso in cui l’ecografo utilizzato sia un dispositivo in grado di fornire anche l’informazione nella terza dimensione, e rendendo quindi l’anatomia di interesse più comprensibile, è possibile, tramite software, individuare la fetta di maggiore interesse (nel caso 2D) o l’orientazione migliore del volume (nel caso 3D). Quello che si possiede infatti, quando si parla di ECO 3D+T, è una successione di volumi catturati nel tempo. Il volume, a sua volta, rappresenta uno stack di fette distanziate tra loro di una certa distanza interfetta, dipendente dal sistema di acquisizione considerato. Per orientare il volume nella posizione deside- rata e rendere quindi maggiormente visibili le strutture di interesse, si è ricorso a "3DSlicer". Il software è scaricabile al seguente link (download.slicer.org) e la versione utilizzata in questo lavoro di tesi tra quelle disponibili è "4.10.2". Ciò che 3DSlicer può ricevere in ingresso sono dei files DICOM. Nel caso del presente lavoro di tesi, sono stati considerati dati provenienti da un ecografo GE, in grado di fornire anche la terza componente spaziale. Essendo dati proprietari, è stato necessario operare una conversione in formato Dicom, cosicché tali dati potessero essere letti dal software. Per fare ciò, è stato creato un file Matlab "read3DUS-GE.m", che, preso in ingresso il percorso al quale si trovano i files derivanti dall’acquisizione ecocardiografica, fornisse

in uscita una serie di items. Questi ultimi, in formato Dicom, dovranno essere poi selezionati e spostati in una determinata cartella di destinazione, che conterrà quindi i Dicom dei vari frames catturati nel tempo. I passi successivi da compiere in 3DSlicer, una volta che si hanno a disposizione i dati nel formato desiderato, sono i seguenti. Si deve innanzitutto importare la cartella contenente le immagini Dicom selezionando il modulo "DICOM" e, una volta scelta la cartella, cliccando su "Import" e poi "Load". Se con "Load" la cartella non viene caricata, si deve selezionare un modulo a caso tra quelli presenti e ripetere l’operazione cliccando su "DCM" e poi "Load" come in 4.1. E’ anche possibile lavorare con l’intera serie temporale di volumi anzi che con il singolo item. 3DSlicer infatti fornisce anche il modulo "MultiVolumeExplorer" che consente all’operatore di esplorare il volume lungo i frames che compongono l’intera acquisizione (4.2). Compaiono subito le tre viste messe a disposizione di default

Figura 4.1: Schermata 3DSlicer, Import e Load

da 3DSlicer: Assiale, Sagittale e Coronale (rispettivamente in rosso, giallo e verde). Per poter rendere il tutto più comprensibile e riuscire ad individuare le strutture di interesse, con il modulo "VolumeRendering" si ottiene anche la vista del volume nella

Figura 4.2: Schermata 3DSlicer, Esplorazione del Volume nel tempo

sua interezza. Infatti, selezionando sulla voce "Volume" di questo modulo il nome del volume che si intende ispezionare e, cliccando poi sul tasto a forma di occhio subito a sinistra, tale volume compare nella quarta vista come in 4.3. E’ possibile

Figura 4.3: Schermata 3DSlicer, Volume Rendering

variare anche manualmente la vista dalle quale si osserva il volume. Per fare ciò ci si serve del modulo "Reformat" che consente di individuare la direzione di interesse

inclinando l’asse o inserendo valori numerici (4.4). Non è possibile però salvare un nuovo volume o una nuova fetta a partire dalla vista desiderata, se non come immagini ".png" o in formato ".nrrd". Per ovviare a questo problema e quindi ottenere

Figura 4.4: Schermata 3DSlicer, Vista in Reformat

come risultato il volume ricostruito a partire dalla nuova direzione di taglio, si è percorsa una strada differente. Dal momento che risulta impossibile ottenere il nuovo volume direttamente da 3DSlicer, la tecnica utilizzata è stata quella di estrappolare dal software una determinata matrice di rototraslazione di interesse e di applicare poi questa in ambiente Matlab al volume considerato. Prima di procedere in tal senso, quello che è stato fatto è stato settare in maniera differente l’origine degli assi presa a riferimento dal software. Selezionando il modulo "Volumes" compaiono le voci "Image Spacing" e "Image Origin" e cliccando poi su "Center Volume" si fa si che l’origine del volume preso a riferimento da 3DSlicer non sia più al centro del volume stesso ma coincida con quello che anche Matlab prende come riferimento. Fondamentale però è il calcolo della matrice di rototraslazione, che risulta quindi dipendente dalla scelta dell’origine e che, nel caso in cui non venisse concluso il passo precedente, sarebbe affetta da errori. Si deve quindi selezionare il modulo "Transforms" e, agendo direttamente sull’immagine del volume ruotandola oppure settando numericamente i valori di LR, PA, IS, LR, PA, IS, si ottiene la matrice di trasformazione che consente di disporre del Volume con la vista desiderata. Per rendere operativo il tutto è indispensabile prima selezionare nella voce "Active Transform" il campo "Create new LinearTransform", in "Interaction" "Visible in 3D View" e in "Apply Transform" il volume

Figura 4.5: Schermata 3DSlicer, Settaggio sistema di riferimento

da considerare e cliccare poi sulla freccia disposta verso destra, e in ultima istanza su "Apply" (4.6). A questo punto, con i valori della matrice di rototraslazione ottenuta, si procede in Matlab (versione R2018b). Essenzialmente Matlab e 3DSlicer operano diversamente in quanto considerano le matrici omogenee con i valori di traslazione disposti rispettivamente nell’ultima riga, e nell’ultima colonna. In aggiunta Matlab non considera, diversamente da 3DSlicer, il contributo della traslazione, tanto che si potrebbero settare tali valori a 0. Fatti questi aggiustamenti, si può infine applicare la funzione Matlab "affine3D" che, data in ingresso una matrice, fornisce in uscita il corretto settaggio delle proprietà di T (una valida trasformazione affine definita dalla matrice non singolare di ingresso). Con la matrice di rotazione ottenuta, si applica la funzione "imwarp" che opera la trasformazione desiderata. Una volta effettuata la trasformazione, a questo punto è stato modificato il pacchetto Matlab "View4D V2.0.0.0" (https://it.mathworks.com/matlabcentral/fileexchange/44600-

Figura 4.6: Schermata 3DSlicer, Settaggio matrice di trasformazione

di ottenere la vista coronale, sagittale e assiale del volume. Una volta posizionati nella fetta di interesse, basta uscire da tale tool. In questo modo viene memorizzata la fetta di interesse, che quindi risulta essere pronta per i passaggi successivi (vedi Fig.4.7).

Documenti correlati