# Algoritmi di ricostruzione tomografica

Gli algoritmi di ricostruzione tomografica sono un insieme di metodi matematici utilizzati per ottenere un'immagine della sezione o una ricostruzione tridimensionale di un soggetto a cui è stata effettuata una tomografia.
Questi algoritmi rielaborano i dati di proiezione contenuti nel sinogramma del soggetto sottoposto a scansione, che è anche il risultato della trasformata di Radon del soggetto stesso. Tali dati sono costituiti da una serie di proiezioni effettuate da diverse angolazioni attorno al soggetto da analizzare e vengono acquisiti misurando l'attenuazione dei raggi X (nel caso della TAC) mentre questi attraversano il soggetto in diverse direzioni. L'obiettivo di questi algoritmi è quindi quello di determinare l'attenuazione dei raggi X in ogni punto dello spazio di ricostruzione sotto analisi al fine di estrarne un'immagine.

## Classificazione

Gli algoritmi (o metodi) di ricostruzione tomografica possono essere divisi principalmente in due categorie:
* Metodi analitici → algoritmi basati su considerazioni matematiche riguardo il problema, in particolare sull'antitrasformata di Radon. I metodi analitici sono poco onerosi in termini di calcolo, ma sono poco robusti in scenari caratterizzati da una bassa emissione di radiazioni o in cui il rapporto segnale rumore è basso.
* Metodi algebrici → considerano la ricostruzione come il risultato di un problema di ottimizzazione ottenuto in maniera iterativa. Questi ultimi metodi permettono lo sfruttamento di eventuali informazioni conosciute a priori riguardo l'oggetto da ricostruire ma, in virtù della loro natura iterativa e d'ottimizzazione, sono generalmente più impegnativi da un punto di vista computazionale rispetto ai metodi analitici, sebbene il calcolo possa essere parallelizzato e accelerato con l'ausilio di una GPU.

## Metodi analitici

Gli approcci analitici sono basati su considerazioni matematiche effettuate sul principio di funzionamento della tomografia, ovvero l’operazione di proiezione. Nel caso bidimensionale, l'obiettivo è estrarre una fetta (o slice) del soggetto sotto analisi corrispondente al piano su cui si trovano i raggi, sottesi tra la sorgente e il rivelatore (o detector). Per farlo, il soggetto è posto solitamente sull’asse di rotazione di sorgente e detector e questi catturano diverse proiezioni del soggetto da diverse angolazioni intorno ad esso.
Alla fine di questa procedura, i dati raccolti possono essere riorganizzati sovrapponendo ciascuna proiezione all'altra per creare il sinogramma, che si presenta come un'immagine in cui le righe corrispondono alle proiezioni ottenute a diversi angoli e le colonne corrispondono ai sensori che compongono il detector. Il nome sinogramma deriva dal fatto che il suo contenuto ricorda l'unione di diverse onde sinusoidali: supponendo che il soggetto della scansione sia un punto (quindi una funzione delta di Dirac in 2D), il risultato nel sinogramma sarebbe una singola onda sinusoidale, con un'ampiezza crescente all’allontanarsi dall'asse di rotazione. Il sinogramma può essere quindi considerato una combinazione di molteplici onde sinusoidali poiché il soggetto della scansione, se discretizzato, può essere visto come una combinazione di funzioni delta di Dirac, e dal momento che il sinogramma è anche il risultato della trasformata di Radon di un oggetto e dal momento che tale trasformazione è lineare, la combinazione di sinusoidi che compone il sinogramma è lineare.
Una singola proiezione contenuta nel sinogramma può essere formalizzata come:
$p_{\theta }(t)=\int _{L(\theta ,t)}f(x,y)ds$
Dove $f(x,y)$ è l’oggetto sotto scansione, mentre $L(\theta ,t)$ rappresenta la direzione di un raggio del fascio di scansione all’angolo $\theta$ che incide sul pixel t del detector, e può essere formalizzato come:
$L(\theta ,t)={(x,y)\in \mathbb {R} \times \mathbb {R} :x\cos \theta +y\sin \theta =t}$
L’intero sinogramma può essere invece ottenuto applicando la trasformata di Radon:
${\mathcal {R}}f(\theta ,t)=\int {L(\theta ,t)}f(x,y)ds$
È possibile applicare al sinogramma la trasformata di Radon inversa per riottenere la funzione ${\textit {f}}$ e quindi la ricostruzione, tuttavia bisogna tenere presente che ciò funzionerebbe perfettamente solo se la trasformata di Radon, o la scansione CT, fossero effettuate in maniera continua e non discreta, con un numero infinito di angoli $\theta$ e punti del rivelatore $t$.
Un altro elemento matematico è costituito dal teorema della fetta di Fourier, che collega tra loro la trasformata di Radon e la trasformata di Fourier bidimensionale. Dato una funzione bidimensionale ${\textit {f}}$, il teorema della fetta di Fourier afferma che:
* effettuare la proiezione di tale funzione su una linea monodimensionale con un angolo $\theta$ (come nella trasformata di Radon) e poi effettuare la trasformata di Fourier monodimensionale di tale proiezione;
* effettuare la trasformata di Fourier bidimensionale di ${\textit {f}}$ e poi sezionare il risultato lungo una linea con un angolo $\theta$ che attraversa l'origine;
sono operazioni equivalenti, che portano allo stesso risultato.
Questo teorema evidenzia la relazione che esiste tra la trasformata di Fourier bidimensionale e la trasformata di Radon: conoscendo le proiezioni per tutti gli angoli $\theta$ intorno a un oggetto, è possibile infatti ottenere la sua trasformata di Fourier bidimensionale semplicemente effettuando la trasformata di Fourier unidimensionale di tutte le proiezioni e poi organizzandole in uno spazio bidimensionale come linee che passano attraverso l'origine inclinate dell’angolo $\theta$. A questo punto, la funzione ${\textit {f}}$ può essere recuperata applicando la trasformata di Fourier bidimensionale inversa.
Dal momento che i dati di proiezione a diversi angoli sono ciò che produce una tomografia, questo algoritmo può essere usato per ottenere una ricostruzione. Tuttavia, sussistono dei problemi con l'utilizzo di questo approccio. Innanzitutto, la quantità di misurazioni ottenute da una tomografia è finita, il che porta ad ottenere un dominio di Fourier della ricostruzione che è campionato in maniera non uniforme: i campioni della trasformata di Fourier prodotti da questo approccio si trovano infatti distribuiti lungo cerchi concentrici invece che seguire una griglia, una caratteristica richiesta per algoritmi come la trasformata di Fourier veloce per ottenere l'antitrasformata di Fourier. Il secondo problema risiede nel fatto che la distribuzione campionaria del dominio di Fourier è molto più densa vicino all'origine rispetto alle regioni esterne: ciò significa che le frequenze più basse sono sovra rappresentate rispetto alle frequenze più alte e quando verrà applicata la trasformata di Fourier inversa l’immagine finale sarà sfocata.

### Algoritmo di retroproiezione

L'algoritmo di retroproiezione (o algoritmo di back-projection) è un metodo di ricostruzione analitico equivalente all'operazione inversa di proiezione (o antitrasformata di Radon), che nella tomografia computerizzata avviene quando i raggi X proiettano il soggetto sotto scansione sui diversi pixel del detector.
In questo algoritmo, ciascun punto dell'immagine di uscita riceve un valore proporzionale alla proiezione sul detector del corrispondente punto del dominio dell'oggetto scansionato, per tutti i diversi angoli di proiezione. Per ottenere questo risultato, ciascuna proiezione viene propagata sull'immagine d'uscita lungo una direzione in accordo con il proprio angolo di acquisizione, così che diversi valori provenienti da diversi angoli di acquisizione si sommino nei punti dell'immagine producendo il risultato desiderato. Questa operazione può essere espressa dalla seguente equazione:
$f_{bp}(x,y)=\int p_{\theta }(\rho )d\theta =\int p_{\theta }(x\cos \theta +y\sin \theta )d\theta$
dove $f_{bp}(x,y)$ rappresenta l'immagine di uscita, $p_{\theta }$ una proiezione a un certo angolo e ciascun punto $(x,y)$ rispetta l'equazione $\rho =x\cos \theta +y\sin \theta$.
Sebbene l'algoritmo di retroproiezione richieda una capacità di calcolo limitata per produrre un risultato, il suo svantaggio risiede nella produzione di immagini affette da sfocatura. Se si prova ad applicare l'algoritmo ad uno stesso soggetto di partenza ma si effettuano ricostruzioni con un numero crescente di proiezioni, si potrà notare come l'immagine di uscita con più proiezioni risulti più delineata rispetto a quelle con meno proiezioni, tuttavia ancora sfocata rispetto al soggetto scansionato. La ragione di questo effetto è dovuta ad una sovra rappresentazione delle basse frequenze rispetto alle alte frequenze nei dati di proiezione, e può essere risolto filtrando i dati come avviene nell'algoritmo di retroproiezione filtrata.

### Algoritmo di retroproiezione filtrata

L’algoritmo di retroproiezione filtrata (o di filtered back-projection) è un metodo analitico ed un’evoluzione dell’algoritmo di retroproiezione che mitiga gli effetti di sfocatura.
Operativamente, è diviso in due parti: fase di filtraggio e fase di retroproiezione. La prima è una fase di pre-elaborazione dei dati, che serve a preparare i dati prima che vengano rielaborati dalla seconda, ed è equivalente all’algoritmo di retroproiezione. La prima fase infatti consiste nel filtrare tutte le proiezioni presenti nel sinogramma al fine di attenuare le basse frequenze. In questo modo, quando i dati saranno ricostruiti nella seconda fase, l’immagine finale non apparirà sfocata.
Per effettuare questa operazione possono essere impiegati diversi tipi di filtri passa alto, ma spesso è utilizzato il filtro di Ram-Lak che è in grado di attenuare le basse frequenze, amplificare le alte e tagliare tutte le frequenze oltre una certa soglia definita come frequenza di taglio (o di cut-off). Il filtro viene applicato nel dominio delle frequenze. Per prima cosa, viene applicata la trasformata di Fourier alle proiezioni, poi il risultato di questa operazione viene moltiplicato per il filtro effettuando quindi il filtraggio. Infine, il risultato viene riportato nel dominio iniziale tramite l’antitrasformata di Fourier.
Una volta effettuato il filtraggio, i dati vengono retroproiettati seguendo i passi dell’algoritmo di retroproiezione. Questo metodo può essere formalizzato con le seguenti equazioni:
${\begin{cases}f_{fbp}(x,y)=\int q_{\theta }(x\cos \theta +y\sin \theta )d\theta \\\\q_{\theta }(\rho )=\int P_{\theta }(\omega )H(\omega )e^{j2\pi \omega t}d\omega \end{cases}}$
dove $q_{\theta }$ sono le proiezioni filtrate nel dominio delle frequenze ottenute dalla moltiplicazione del loro spettro $P$ con lo spettro del filtro $H$ ed ogni punto dell'immagine di uscita $(x,y)$ soddisfa l'equazione $\rho =x\cos \theta +y\sin \theta$.
Provando ad applicare questo algoritmo ad uno stesso soggetto, ma effettuando ricostruzioni con un numero crescente di proiezioni e comparando i risultati dell'esperimento con quelli ottenuti utilizzando l’algoritmo di retroproiezione, si potrà notare come, a parità di numero di proiezioni utilizzate, il risultato dell’algoritmo di retroproiezione filtrata appare più definito e meno sfocato. Ciò è dovuto al fatto che le basse frequenze non sono più sovra-rappresentate rispetto alle alte poiché soppresse dal filtro.

## Metodi algebrici

Gli approcci algebrici si basano su un sistema di equazioni in forma matriciale che rappresenta l'operazione di proiezione. Questo sistema può essere scritto come:
$Wv=p$
dove $v$ è un vettore monodimensionale contenente tutti gli $n$ pixel del volume da ricostruire, $p$ è un vettore monodimensionale contenente tutti gli $M$ elementi del sinogramma (ciascun elemento rappresenta quindi il valore della misurazione effettuata da un pixel del detector in una determinata direzione di proiezione) e $W$ è una matrice bidimensionale di dimensione $M\times n$ chiamata matrice di proiezione.
Il ruolo della matrice di proiezione è quello di mettere in relazione le misurazioni o proiezioni effettuate con il volume da ricostruire. Il contenuto della matrice può quindi essere interpretato come la quantità con cui ciascun pixel del volume scansionato contribuisce a ciascuna singola misurazione contenuta in ogni proiezione.
Quando l'operazione espressa dall'equazione riportata viene eseguita è come se, considerando un singolo valore del vettore risultante $p$, l'operazione che si sta svolgendo sia:
$p_{i}:=\sum _{j=0}^{n-1}w_{ij}v_{j}$
che è una combinazione lineare di tutti i pixel del volume del soggetto, ciascuno pesato da un valore che esprime quanto contribuisce alla misurazione. Poiché una singola riga della matrice $W$ corrisponde fisicamente a un raggio che attraversa il volume sotto analisi e quindi non tutti i pixel del volume entreranno in contatto con esso, la matrice di proiezione risulta essere estremamente sparsa.
Questa formulazione matriciale è un modo per esprimere in forma di combinazione lineare ciò che accade quando un oggetto è sottoposto a tomografia ed è una formulazione equivalente a quella di una trasformata di Radon discreta: in entrambi i casi il risultato sarà il sinogramma del volume del soggetto sotto analisi. La forma inversa di questa formulazione algebrica è alla base degli approcci algebrici per ottenere una ricostruzione. Considerando tale formulazione inversa:
$u:=W^{T}p$
e fissando come riferimento un singolo valore del vettore risultante $u$, l'operazione che si sta svolgendo è la seguente:
$u_{j}:=\sum _{i=0}^{m-1}w_{ij}p_{i}$
che esprime come il valore associato a un certo pixel del volume sia una combinazione lineare di tutte le misurazioni correlate a quel pixel. Se la moltiplicazione della matrice $W^{T}$ con il vettore $p$ viene eseguita, viene svolta un'operazione equivalente a quella dell'algoritmo di retroproiezione, ottenendo una ricostruzione.
I valori contenuti all'interno della matrice di proiezione dipendono dal setup di acquisizione e dalla sua geometria e, per la definizione di tali valori, è possibile ricorrere a diversi kernel di proiezione. Nel caso del kernel a linea, i pesi vengono definiti considerando la distanza percorsa da ogni raggio attraverso ciascun pixel del volume. Nel caso del kernel di Joseph, per ogni riga o colonna del volume del soggetto si considerano i due pixel più vicini dove il raggio interseca tale riga o colonna e i pesi vengono trovati mediante interpolazione lineare tra i pixel considerati. Un altro possibile kernel è il kernel a striscia, in cui i raggi non sono considerati come linee ma come strisce con una larghezza pari alla larghezza dei sensori del rivelatore e i pesi vengono trovati misurando l'area di ciascun pixel coperta dalla striscia.
Ciascun kernel di proiezione presenta un compromesso tra precisione ed efficienza. Il kernel a striscia è quello che permette una rappresentazione più vicina e quindi più precisa a ciò che accade nella realtà, ma è anche il più complesso in termini di calcolo dei pesi. Per questo motivo, il kernel a linea viene di solito preferito.

### Tecnica di ricostruzione iterativa simultanea

La tecnica di ricostruzione iterativa simultanea (simultaneous iterative reconstruction technique o SIRT) è un approccio di ricostruzione algebrico e iterativo che, ad ogni passo, aggiorna la ricostruzione finale utilizzando contemporaneamente tutti i dati di proiezione. L'equazione che viene risolta ad ogni passo del ciclo di iterazione si può esprimere come:
$v^{(k+1)}=v^{(k)}+CW^{t}R(p-Wv^{(k)})$
Ad ogni iterazione, il sinogramma della soluzione corrente viene generato e sottratto dal sinogramma di input dell'algoritmo: questo è espresso dalla porzione di espressione $p-Wv^{(k)}$, dove la proiezione diretta $Wv^{(k)}$ della soluzione corrente $v^{(k)}$ viene sottratta dai dati di proiezione disponibili $p$. In seguito, la differenza appena calcolata viene pesata tramite la matrice diagonale $R$, la quale contiene sulla diagonale principale un valore uguale all'inverso della somma di tutte le righe della matrice di proiezione $W$. Questa operazione assicura che i valori della differenza calcolata in precedenza siano ponderati da un valore che rappresenta l'inverso della lunghezza percorsa da ciascun raggio all'interno del volume, al fine di garantire la convergenza dell'algoritmo. Questa quantità viene poi retroproiettata mediante la pre-moltiplicazione con la matrice $W^{T}$ per riportare l'elemento calcolato nel dominio della ricostruzione e il risultato viene nuovamente pesato dalla matrice $C$, la quale contiene sulla diagonale un valore uguale all'inverso della somma di tutte le colonne della matrice di proiezione $W$. Infine il termine di aggiornamento appena calcolato viene aggiunto alla soluzione corrente, generando una nuova soluzione aggiornata.
La soluzione iniziale utilizzata per inizializzare questo algoritmo è solitamente un'immagine nera, con valori pari a zero.
Una ulteriore formulazione di questo algoritmo è la seguente:
$f_{j}^{(k+1)}=f_{j}^{(k)}+{\frac {1}{\sum _{i=1}^{M}\omega _{ij}}}\sum _{i=1}^{M}({\frac {\omega _{ij}(p_{i}-\sum _{h=1}^{N}\omega _{ih}x_{h}^{(k)})}{\sum _{h=1}^{N}\omega _{ih}}})\quad \forall j$
In questa equazione, $f_{j}^{(k)}$ rappresenta la ricostruzione al passo $k$, $\omega _{ij}$ rappresenta il valore contenuto nella colonna $i$ e nella riga $j$ della matrice di proiezione $W$, $p$ sono i valori dei dati di proiezione e $x$ sono i valori contenuti nella ricostruzione.

### Tecnica di ricostruzione algebrica

La tecnica di ricostruzione algebrica (algebraic reconstruction technique o ART) è una tecnica di ricostruzione algebrica e iterativa il cui concetto è stato proposto inizialmente da Stefan Kaczmarz e successivamente adattato da Richard Gordon, Robert Bender e Gabor Herman per la ricostruzione di immagini.
Questo algoritmo è in grado di calcolare una soluzione approssimata del sistema di equazioni lineari $Wu=p$ eseguendo iterativamente la formula:
    $u^{k+1}=u^{k}+\lambda _{k}{\frac {p_{i}-\langle w_{i},u^{k}\rangle }{|w_{i}|^{2}}}w_{i}^{T}$
dove $a_{i}$ è la riga $i$ della matrice $W$, $u_{i}$ è il componente numero $i$ del vettore $u$ e $\lambda _{k}$ è un parametro compreso tra $0$ e $1$ utilizzato per controllare la convergenza del sistema, dando la possibilità di controllare il bilanciamento tra qualità dell'output e tempo di calcolo.

### Tecnica di ricostruzione algebrica simultanea

La tecnica di ricostruzione algebrica simultanea (simultaneous algebraic reconstruction technique o SART) è un approccio di ricostruzione algebrico ed iterativo, evoluzione della tecnica di ricostruzione algebrica (ART), sviluppato da Anders Andersen e Avinash Kak nel 1984.
Questo algoritmo è strettamente legato anche all'algoritmo SIRT. La differenza principale tra SIRT e ART consiste nel fatto che in SIRT il passo di iterazione contiene sia la proiezione diretta sia la retroproiezione su tutti i valori del rivelatore, mentre nell'approccio ART si utilizza solo un singolo valore del rivelatore per effettuare l'aggiornamento. Ciò implica che l'approccio di ART genera ricostruzioni molto più rapide, tuttavia la convergenza di questo metodo non è garantita e ciò può rappresentare un problema in caso di misure rumorose.
L'algoritmo SART può essere considerato come un compromesso tra questi due metodi: in questo approccio, ad ogni iterazione vengono aggiornati solo i valori corrispondenti ai punti del dominio della ricostruzione la cui proiezione appartiene a una determinata direzione di proiezione, combinando così la velocità del metodo ART con la stabilità di convergenza di SIRT.
Nell'algoritmo SART, l'ordine in cui le direzioni di proiezione vengono considerate può essere qualunque, tuttavia è importante considerare che, se vengono scelte due direzioni di proiezione vicine in due iterazioni consecutive, questo comporterà poca aggiunta di informazione alla ricostruzione che viene costruita iterativamente. Per questo motivo, è sconsigliabile considerare le proiezioni in ordine sequenziale, ma sarebbero meglio usarle in ordine casuale.
Il passo di aggiornamento di SART può essere formalizzato come segue e, se confrontato con la formula esplicita di SIRT, si può notare come siano molto simili e che la formula di SART ha maggiori vincoli legati al valore del rivelatore da utilizzare.
$f_{j}^{(k+1)}=f_{j}^{(k)}+{\frac {1}{\sum _{i\in I_{\theta }}\omega _{ij}}}\sum _{i\in I_{\theta }}({\frac {\omega _{ij}(p_{i}-\sum _{h=1}^{N}\omega _{ih}u_{h}^{(k)})}{\sum _{h=1}^{N}\omega _{ih}}})\quad \forall j$
In questa equazione $f_{j}^{(k)}$ rappresenta la ricostruzione al passo $k$, $\omega _{ij}$ rappresenta il valore contenuto nella colonna $i$ e nella riga $j$ della matrice di proiezione $W$, $p$ sono i valori dei dati di proiezione e $x$ sono i valori contenuti nella ricostruzione.
Numerose varianti di SART sono state proposte negli anni nella letteratura scientifica, tra le quali: SARTF, FA-SART, OS-SART, VW-OS-SART.

### Metodo del gradiente coniugato

Il metodo del gradiente coniugato ai minimi quadrati (conjugate gradient least squared o CGLS) è un algoritmo algebrico utilizzato per risolvere un generico sistema di equazioni del tipo $Ax=b$ e può essere dunque utilizzato per la ricostruzione tomografica, dato che risolve anche il sistema di equazioni che descrivono la relazione tra i dati di proiezione e l'immagine da ricostruire.
Durante il processo di ricostruzione, CGLS cerca di minimizzare la differenza quadratica tra i dati di proiezione misurati e quelli stimati iterativamente. Ad ogni iterazione, l'algoritmo calcola una direzione di ricerca coniugata che minimizza l'errore residuo. Successivamente, questa direzione di ricerca viene utilizzata per aggiornare l'immagine stimata e CGLS continua a iterare fino a quando l'immagine converge verso una soluzione approssimata. Questo algoritmo è noto per la sua velocità e capacità di gestire grandi quantità di dati, ma può essere sensibile al rumore nei dati di proiezione.
CGLS è un algoritmo derivato dal più generale metodo del gradiente coniugato, ma altre varianti sono state proposte per risolvere il problema tomografico come ad esempio MCGT che applica il metodo del gradiente coniugato a un sistema di Tikhonov.

## Metodi basati sull'apprendimento profondo

I metodi di apprendimento profondo sono ampiamente utilizzati per la ricostruzione di immagini e sono stati applicati in diversi ambiti, tra cui la riduzione del rumore nelle tomografie a bassa dose di radiazioni, la ricostruzione con numero sparso di viste, la tomografia ad angolo limitato e la riduzione degli artefatti dovuti alla presenza di metalli. Una panoramica eccellente può essere trovata nell'edizione speciale della rivista IEEE Transactions on Medical Imaging. Ad esempio, una delle maggiori tipologie di algoritmi di ricostruzione tramite deep learning applica reti neurali di post-processing per migliorare una ricostruzione già esistente, ottenuta in precedenza tramite metodi di ricostruzione convenzionali. Un esempio di applicazione è la riduzione degli artefatti utilizzando la rete U-Net nella tomografia ad angolo limitato.
In un'immagine ricostruita mediante un metodo completamente basato sui dati usando come input il sinogramma, possono tuttavia verificarsi degli errori. Pertanto, l'integrazione di operatori noti nella progettazione dell'architettura delle reti neurali potrebbe risultare vantaggiosa, come descritto nel concetto di apprendimento di precisione. Ad esempio, la ricostruzione diretta di immagini dai dati di proiezione può essere appresa dalla struttura dell'algoritmo di retroproiezione filtrata. Un altro esempio è la costruzione di reti neurali mediante l'iterazione di algoritmi di ricostruzione. Oltre all'apprendimento di precisione, un approccio alternativo per migliorare la qualità delle ricostruzioni ottenute tramite deep learning è utilizzare metodi di ricostruzione convenzionali applicati a una precedente ricostruzione basata su deep learning.

## Software di ricostruzione tomografica

Per la ricostruzione tomografica sono disponibili toolbox open source come PYRO-NN, TomoPy, CONRAD, ODL, ASTRA toolbox e TIGRE.
TomoPy è una toolbox open source in Python progettata presso l'Argonne National Laboratory appositamente per l'elaborazione di dati tomografici e le operazioni di ricostruzione di immagini. TomoPy include diversi algoritmi di ricostruzione, che possono essere eseguiti su workstation multicore e strutture di calcolo di grandi dimensioni.
CONRAD è una toolbox open source specializzata nella tomografia a fascio conico. Offre una vasta gamma di funzionalità per l'acquisizione e l'elaborazione di immagini a raggi X, compresa la ricostruzione tomografica.
ODL (Operator Discretization Library) è una toolbox open source per l'apprendimento automatico, la ricostruzione tomografica e altre applicazioni di elaborazione delle immagini. Supporta diverse geometrie di acquisizione, algoritmi di ricostruzione e metodi di regolarizzazione.
TIGRE è una toolbox MATLAB sviluppata congiuntamente dall'Università di Bath e dal CERN per la ricostruzione di immagini CBCT. Offre una vasta gamma di algoritmi di ricostruzione e sfrutta l'accelerazione GPU per ridurre i tempi di calcolo.
ASTRA toolbox è una toolbox MATLAB e Python di primitive GPU ad alte prestazioni per la tomografia 2D e 3D, sviluppato dal 2009 al 2014 dal laboratorio di visione iMinds-Vision Lab dell'Università di Anversa e successivamente sviluppato congiuntamente da imec-VisionLab (ex iMinds-VisionLab) e CWI di Amsterdam. Questa toolbox supporta la tomografia parallela, a ventaglio e a fascio conico oltre a permettere un posizionamento altamente flessibile della sorgente e del rivelatore. Nel 2016, ASTRA è stato integrato nel framework TomoPy. Questa integrazione ha permesso agli utenti di ASTRA di sfruttare le funzionalità di TomoPy per il filtraggio dei dati e la correzione degli artefatti, mentre ha permesso agli utenti di TomoPy di usufruire di un maggior numero di algoritmi di ricostruzione. Gli algoritmi di ricostruzione disponibili tramite l'integrazione tra TomoPy e ASTRA comprendono FBP, Gridrec, ART, SIRT, SART, BART, CGLS, PML, MLEM e OSEM.