Applicazioni di Grafica 3D real-time altamente immersive” del progetto
“Ambienti di Realtà Virtuale Altamente Immersivi”, e fornisce uno
strumento informatico a supporto di una delle branche più importanti
della medicina: la “diagnostica per immagini”.
In particolare, è in fase d’avanzata realizzazione un’architettura
software basata su tecnologie a componenti, altamente scalabile e
performante per la realizzazione d’ambienti di realtà virtuale, in grado
di connettere dispositivi eterogenei (HMD
1
, CAVE
2
, Data Glove
3
, etc)
attraverso l’utilizzo d’interfacce semplici e portabili. Requisito essenziale
della struttura modulare dell’architettura è l’utilizzo di librerie e
strumenti open source e cross platform, che facilitano lo sviluppo
d’ambienti di realtà virtuale immersiva. Ciò è necessario in quanto le
applicazioni attualmente in commercio per la visualizzazione in grafica
3D, costituiscono delle scatole nere il cui contenuto è noto solo alle case
produttrici. Esistono inoltre una serie di prodotti open source, che
offrono le medesime funzionalità, vincolate però all’utilizzo di uno
specifico sistema operativo. Un esempio di tali applicazioni é OsiriX,
[OSI] software d’image processing, sviluppato per piattaforme Apple
Macintosh, di cui si riporta l’architettura software in figura 1.1.
Alcune librerie utilizzate da tale software, quali QuickTime
4
e Cocoa
5
,
1
Gli HMD sono caschi con schermi LCD o CRT per la visualizzazione di ambienti
tridimensionali.
2
Il sistema CAVE (Cave Automatic Virtual Environment) fornisce l'illusione di una
immersione completa in un mondo sintetico tridimensionale ed in scala reale, che si
realizza proiettando immagini stereo sulle pareti ed il pavimento di un cubo all'interno
del quale l'utente può muoversi liberamente, vivere una esperienza immersiva
indossando semplicemente degli occhiali stereoscopici e interagire con gli oggetti
mediante una wand provvista di sensori e pulsanti.
3
Il data GLOVE è un guanto utilizzato nei sistemi di realtà virtuale che indica ad un
elaboratore i movimenti e la posizione delle dita dell'utilizzatore.
4
Quicktime è una tecnologia multimediale per sviluppare video, suono, animazione,
grafica, testo e musica.[QUICK]
5
Cocoa è un ambiente di sviluppo object-oriented progettato per sviluppare
applicazioni native MacOS X [COCOA]
8
costituiscono dei pacchetti commerciali ed, in particolare, Cocoa risulta
essere fortemente legato alla piattaforma MacOS X. Sebbene, quindi,
siano state utilizzate anche librerie open source e cross platform, come
VTK ed ITK, definite qui di seguito, il software risulta essere vincolato
alla suddetta piattaforma.
Figura 1: Architettura Osirix
Scenari virtuali immersivi, interfacce tattili in grado di fornire
sensazioni di forza all'operatore costituiscono solo alcune delle possibili
tipologie tecnologiche utilizzate per offrire simulazioni sempre più
vicine all'esperienza reale e caratterizzate da un alto grado
d’immersività, che sempre più risponde alle necessità di formazione e
training dell'attuale società dell'informazione. “In questo modo i medici
potranno esplorare il corpo (e anche l’anima!) dei loro pazienti” [PUN].
Tuttavia, applicazioni di grafica 3D con un buon grado
d’interattività ed immersività ancora richiedono sistemi altamente
specializzati e spesso molto costosi, che necessitano di driver specifici,
legando in tal modo lo sviluppo di una particolare applicazione ad un
determinato hardware. Pertanto è attualmente molto sentita la necessità
di poter disporre di un’architettura aperta e flessibile per lo sviluppo di
software applicativo che consenta l'integrazione del più ampio range
possibile di device e di componenti software, e che sia funzionale a
settori di grande interesse, come quello dei beni culturali e museali, del
training e della formazione, nonché della visualizzazione e della
simulazione medica e scientifica.
9
I componenti dell'architettura software individuati per la
realizzazione d’applicazioni di realtà virtuale altamente immersive,
rispondono alle caratteristiche sopra individuate.
Dopo un’attenta analisi e studio delle problematiche sopra esposte,
l’architettura scelta per lo sviluppo di applicazioni di realtà virtuale
altamente immersive è mostrata in Figura 2.
Figura 2 Architettura software per lo sviluppo di applicazioni di realtà virtuale
Di seguito è riportata una breve descrizione di ciascun componente
software.
OpenGL (Open Graphic Library): ambiente per lo sviluppo di
applicazioni grafiche 2D e 3D
6
. La libreria di basso livello consente,
inoltre, di sfruttare l’accelerazione hardware delle schede grafiche,
che implementano funzionalità per il rendering
7
real-time 3D e
compatibili con tale standard;
FLTK (Fast Light ToolKit): libreria di alto livello per la creazione
6
Le OpenGL 3D consentono di realizzare applicazioni per la visualizzazione di una
scena 3D. Quest'ultima contiene gli insiemi di dati che rappresentano gli oggetti
tridimensionali e i dati relativi alle loro illuminazione e posizione rispetto
all'osservatore [OPGL].
7
Processo di generazione di un'immagine a partire da una descrizione di un insieme di
oggetti tridimensionali (scena tridimensionale). La descrizione è data in un linguaggio o
in una struttura dati definiti rigorosamente e deve contenere la geometria, il punto di
vista, le informazioni sulla mappatura delle superfici visibili e sull’illuminazione. L'
immagine è una immagine digitale; essa fornisce l'aspetto finale al modello o
all'animazione illuminazione.
10
dell'interfaccia grafica utente (GUI);
VTK (Visualization ToolKit): libreria di alto livello per la visualizzazione
grafica e l’image processing;
ITK (Insight ToolKit): libreria di alto livello che implementa algoritmi di
registrazione e segmentazione;
OSG (Open Scene Graph): libreria di alto livello per applicazioni di
grafica 3D ad alte prestazioni in quanto basato sulla struttura dati
dei scene graph
8
;
VRJ (ViRtual Juggler): framework per lo sviluppo di applicazioni 3D,
orientato all’integrazione di device eterogenei;
Chromium: Motore di rendering 3d distribuito, che consente di
parallelizzare il processo di rendering.
Il modello funzionale dell'architettura cui si fa riferimento è
mostrato in Figura 3.
8
Lo Scene Graph (grafi di scena) è una struttura dati che organizza logicamente la
rappresentazione di una scena grafica. Una scena viene decomposta in oggetti, ogni
oggetto in parti, ogni parte in poligoni. [OSG]
11
Figura 3: Modello funzionale dell'architettura di Figura 2
I.1 I.3 Obiettivo e scopo della tesi
L'architettura considerata per questo lavoro di tesi si concentra
sulla visualizzazione, analisi ed elaborazione d’immagini medicali. Il
software di base messo a disposizione sviluppa un'applicazione open
source e cross platform per la visualizzazione e l'elaborazione
d’immagini medicali in grado di fornire un ambiente per lo sviluppo di
applicazioni per la visualizzazione medicale altamente immersiva. Tale
architettura è mostrata in Figura 4.
Figura 4: Architettura per applicazioni di Medical Imaging
12
Lo scopo di questa tesi è la progettazione ed implementazione di un
componente software per la segmentazione di immagini mediche
all’interno di questa architettura.
La segmentazione è il processo che suddivide un'immagine nelle sue
parti componenti, secondo parametri che sono stabiliti da chi la esegue,
poi usate a scopo di analisi, descrizione e riconoscimento a più alto
livello.
Come si vedrà nel prossimo capitolo, più in generale la segmentazione è
una delle fasi del processo di trattamento dei dati medicali
dall’acquisizione alla visualizzazione finale.
Il procedimento di segmentazione è molto importante per almeno due
motivi. In primo luogo, permettendo di individuare regioni omogenee,
consente di effettuare con estrema facilità delle misurazioni
morfometriche altrimenti estremamente complesse; si pensi, ad esempio,
alla possibilità di calcolare, con ragionevole precisione, il volume di una
massa tumorale a partire da dati tridimensionali ed a quanto ciò possa
essere d’ausilio alla pianificazione della terapia radiante o di un
intervento chirurgico. In secondo luogo consente di classificare i dati a
disposizione in maniera tale che siano più facilmente utilizzabili nel
seguito.
Visto che la segmentazione è un processo che si applica in qualsiasi
campo che tratti immagini digitali,(astrologia, visione robotica,
telerilevamento,ecc), le quali quindi hanno caratteristiche molto
differenti, in questo lavoro di tesi si sono analizzate le principali
tecniche di segmentazione presenti in letteratura, se ne è cercata di fare
una classificazione elencando pregi e difetti, dopodichè si è giunti
all’implementazione di tre algoritmi, che sono risultati i più consoni per
le caratteristiche di immagini medicali, coniugando in sé le proprietà di
efficienza(di calcolo), semplicità di utilizzo e di implementazione,
accuratezza del risultato.
13
Un esempio di segmentazione è riportato in Figura 5, che mostra
l’immagine originale di un cervello, e due regioni segmentate
dell’immagine, rappresentanti rispettivamente la materia bianca e il
ventricolo.
Figura 5: Esempio di segmentazione su cervello
I componenti utilizzati per lo sviluppo del software sono le librerie
di alto livello, suddivise in librerie per la gestione dell'interfaccia grafica,
librerie per la visualizzazione di immagini e modelli tridimensionali ed,
infine, librerie per l'image processing. Alcune delle librerie open source e
cross platform, oggi disponibili per la realizzazione dell'interfaccia
grafica, comprendono wxWindows [WX], Fox-Toolkit [FOX], FLTK, ecc.
Ognuno di questi pacchetti è corredato da una buona documentazione e
sono tenuti in continuo sviluppo dai rispettivi gruppi. La scelta è caduta
su FLTK, perché risulta essere molto semplice da utilizzare e allo stesso
tempo completo. Per quanto riguarda, invece, le librerie di
visualizzazione e d’image processing, la scelta è caduta immediatamente
su VTK e ITK. Questi due componenti, infatti, sono ampiamente
utilizzati nel settore del medical imaging e risultano essere uno standard
de facto per tali applicazioni.
I.4 ITK,VTK,FLTK
III.1 I.4.1 Vantaggi dell'Open Source e del Cross Platform
Con l'avvento dei personal computer, l'informatica si è diffusa in
14
un decennio fino a condizionare la vita quotidiana delle persone e delle
loro attività professionali. Tale velocità di sviluppo tuttavia non le ha
consentito di avere le stesse caratteristiche delle altre industrie
produttive, avere cioè numerosi fornitori in concorrenza fra loro. Il
software è oggi nella mani di pochi grandi gruppi, che impongono i loro
standard proprietari e guidano l'evoluzione più in base ai loro interessi
che alla convenienza degli utenti.
Come alternativa a tutto ciò è nato il movimento “Open Source”,
divenuto popolare soprattutto grazie alla diffusione di Internet, che è
stato ed è tuttora uno dei motori propulsivi dello sviluppo del web. Gran
parte dell'infrastruttura tecnologica di Internet è basata su standard
aperti e software open source, rilasciato con licenze non restrittive sia
nella distribuzione che nell'uso, come GPL
9
, LGPL
10
, ecc [RALF]. Il più
delle volte è utilizzabile gratuitamente, ma la cosa ancor più
entusiasmante, soprattutto per i programmatori, è il codice, che può
essere studiato, analizzato, modificato, ampliato ed esteso. Viene
sviluppato in progetti collaborativi, che spesso coinvolgono sviluppatori
da tutto il mondo, provenienti dalle esperienze più diverse. In molti casi
questo tipo di software risulta essere più affidabile, e funzionale
dell'analogo software proprietario e commerciale. Quale sia la
piattaforma verso la quale gli utenti si indirizzeranno nei prossimi anni è
una questione aperta. Al giorno d'oggi, la maggior parte degli utenti
possiede prodotti Microsoft; allo stesso tempo però c'è la tendenza,
oramai irreversibile, a sfruttare le applicazioni multi-piattaforma Open
Source, soprattutto per ragioni di costi. Questa tendenza porterà
probabilmente ad accantonare l'idea di un sistema operativo
11
GPL (General Public License) garantisce la libertà di condividere e modificare il
software libero [GPL].
10
LGPL (Lesser General Public License), una licenza pubblica meno generale e usata
soprattutto per le librerie [LGPL].
15
proprietario. Si può affermare quindi che il multi-piattaforma nasce
come conseguenza dei software open source e che l'avvento di nuove
piattaforme ha richiesto sempre più al software di essere multi-
piattaforma.
III.2 I.4.2 Caratteristiche comuni di ITK e VTK
ITK (Insight Toolkit) è un toolkit software che offre funzionalità di
segmentazione e registrazione, VTK (The Visualization Toolkit) offre
funzionalità prettamente orientate alla visualizzazione delle immagini e
dei modelli tridimensionali. Entrambi sviluppati in C++, open source e
cross platform, utilizzano processi di wrapping per generare l'interfaccia
tra C++ ed altri linguaggi interpretati quali Tcl, Java e Python. I toolkit
forniscono, quindi, un supporto alla programmazione di basso e alto
livello.
Nella programmazione ad alto livello si costruiscono l'interfaccia
dell'applicazione e la pipeline. Quest'ultima è composta usando le classi
di VTK e ITK come blocchi elementari; a questo scopo si può usare un
linguaggio interpretato senza compromettere le prestazioni.
Nella programmazione di basso livello Per soddisfare particolari
esigenze le librerie possono essere estese inserendo nuove classi.
I due toolkit, inoltre, presentano alcune caratteristiche funzionali in
comune. Alcuni algoritmi di segmentazione, ad esempio, sono
implementati in entrambi i software. Altri algoritmi per l'elaborazione
delle immagini, quali la rotazione, il ridimensionamento, i filtri per lo
smoothing, ecc. sono implementati in entrambi i pacchetti. Oltre ad offrire
funzionalità comuni, essi presentano anche caratteristiche architetturali
del tutto identiche. In particolare, la gestione del flusso dei dati, presenta
un'architettura a pipeline di seguito descritta. Le pipeline supportano la
16
programmazione multithreading
11
e consentono di lavorare in streaming
12
.
Questa caratteristica consente di utilizzare al meglio, ovvero nel modo
più efficiente, la memoria e le risorse dell'elaboratore.
I.4.2.1 Architettura Pipeline
Una pipeline è costituita da una serie di process objects che operano
su uno o più data objects. Contrariamente all'uso comune nella
programmazione object oriented, in VTK ed ITK si è scelto di separare i
dati dalle procedure che li elaborano. I dati sono incapsulati nei data
objects, le procedure nei process objects. I data objects costituiscono le
informazioni di partenza, pertanto il loro trattamento è particolarmente
delicato, in quanto può dar luogo ad eliminazione o aggiunta di
informazioni e può essere solo effettuato mediante metodi formali
13
.
Questo approccio è particolarmente importante nei sistemi in cui la
riservatezza dei dati e la sicurezza sono determinanti e assicura che non
siano introdotti errori nel processo di definizione delle specifiche, in
quello di sviluppo, nel controllo dei risultati e nella progettazione dei
benchmark. I dati differiscono in funzione della loro rappresentazione
interna, che è influenzata dai metodi mediante i quali sono raccolti,
memorizzati ed elaborati, e dai processi che interagiscono con gli stessi. I
dati di partenza, pertanto, possono essere impiegati per ottenere
rappresentazioni diverse o di diversa efficacia rappresentativa.
I process objects si dividono in source, filter e sink objects in base alla
presenza di uno o più input od output, come illustrato in Figura 8
[SCKR].
11
Il multithreading è una tecnica che permette di avere più flussi di esecuzione
contemporanei (thread) di uno stesso programma in esecuzione, su CPU differenti o
sulla stessa.
12
Lo streaming consente di suddividere, in modo trasparente, i dati in parti più piccole,
che una volta elaborate, possono essere riassemblate per ottenere il risultato finale.
13
Tecniche basate sulla definizione matematica di specifiche, sviluppo e verifica di
sistemi.
17
Figura 6: Tipi di Process Object nella pipeline di ITK E VTK
I source objects sono oggetti che producono un data object
leggendolo da un file (reader) oppure costruendolo mediante una
procedura (procedural source). Gli oggetti di tipo filter possono avere
più input e produrre più output, un singolo output può essere usato
come input da più filtri (multiple fan out). I sink objects esportano data
objects su di un file (writer) oppure verso il mapper che consente di
esportare i dati verso altri sistemi. In Figura 12 sono illustrate alcuni
esempi di molteplicità degli oggetti filter.
Figura 7: Molteplicità degli ingressi e delle uscite delle pipeline di ITK e VTK
La connessione tra due process object avviene di solito tramite
l'istruzione:
Filtro2->SetInput(Filtro1->GetOutput());
Per filtri con più entrate o uscite esistono forme di sintassi analoghe. Le
connessioni sono tipizzate, si possono agganciare solo process object che si
scambiano un data object di tipo compatibile. Affinchè la pipeline
produca il risultato atteso occorre che tutti i process objects siano mandati
in esecuzione, l'intero processo è chiamato “esecuzione della pipeline”.
18