Explications techniques :
keywords : tomography, Beer-Lambert law, Radon transform, FBP, Fourier transform, javascript.
notation : \(\fourier{f}(\xi)\) la transformée de Fourier de \(f\) en \(\xi\).
Sommaire
1. Introduction2. La transformée de Radon
3. Récupération de \(\mu\)
a. The projection slice theorem
b. Filtered back projection
4. Intégration numérique
1. Introduction
La loi de Beer-Lambert donne la relation entre l'intensité de lumière en entrée \(I_0\) et en sortie \(I_D\) d'un rayon qui a traversé durant une longueur \(l\) un matériau de coefficient d'absorption \(\alpha\) : $$ \begin{eqnarray*} I_D & = & I_0 e^{-\alpha l}. \end{eqnarray*}$$ Supposons que l'on envoie maintenant un rayon d'intensité \(I_0\) connue en direction d'un détecteur. Le rayon passe à travers différents matériaux de longueurs \((l_i)_{i=1..n}\) et de coefficients d'absorptions \((\mu_i)_{i=1..n}\).Connaissant ces intensités, on utilise une méthode de « projection inverse » (FBP) qui permet de trouver le coefficient d'absorption \(\mu(\rar{x})\) en tout point \(\rar{x}\).
2. La transformée de Radon
Avec \(\varphi \in [0, 2\pi[\) et \(s \in [-1, 1]\) on a
$$
\begin{eqnarray*}
\rar{\theta}(\phi) = \left(
\begin{array}{c}
\cos{\phi}\\
\sin{\phi}
\end{array}
\right) & \text{et} &
\rar{\zeta}(\phi) = \left(
\begin{array}{c}
-\sin{\phi}\\
\cos{\phi}
\end{array}
\right).
\end{eqnarray*}
$$
D'ou la définition suivante d'une ligne (rayon) pour un angle \(\phi\) à une distance \(s\) du centre :
$$
\begin{eqnarray*}
L_{\phi, s} & = & \{\rar{x} \in \Re^2, \rar{x} \cdot \rar{\theta}(\phi) = s\}\\
& = & \{\rar{x} = s \rar{\theta}(\phi) + l \rar{\zeta}(\phi),\ \forall\ l \in \Re\}\\
& = & s \rar{\theta}(\phi) + \Re \rar{\zeta}(\phi).
\end{eqnarray*}
$$
La transformée de Radon d'une fonction \(\mu \in L^1(\Re^2)\) noté \(R_\mu\) est alors défini par :
$$
\begin{eqnarray*}
\highlight{
R_\mu(\phi, s) = \int_{L_{\phi, s}} \mu(\rar{x}) d\rar{x}
}
\end{eqnarray*}
$$
Aussi notée \( R_\mu(\phi, s) = \displaystyle\int_{\Re^2} \mu(\rar{x}) \delta_0(\rar{x} \cdot \rar{\theta}(\phi) - s) d\rar{x}\). (Avec \(\delta_0\) la fonction dirac en 0) |
3. Récupération de \(\mu\)
On cherche maintenant à obtenir une formule donnant \(\mu \in L^1(\Re^2)\) à partir des données \(R_\mu(\phi,s)\) récupérées.a. The projection slice theorem
$$ \begin{eqnarray*} \forall \phi \in [0, 2\pi], \sigma \in \Re, \quad \fourier{R_\mu(\phi, \cdot)}(\sigma) & = & \fourier{\mu}(\sigma \rar{\theta}(\phi)) \end{eqnarray*}$$b. Filtered back projection
$$ \begin{eqnarray*} \highlight{ \mu(\rar{x}) = \int_0^\pi \int_{\Re} R_\mu(\phi, t) r(\rar{x}\cdot\rar{\theta}(\phi) - t) dt d\phi } \end{eqnarray*}$$La fonction \(r\) est obtenue par transformée de Fourier inverse et on obtient $$\begin{eqnarray*} r(s) & = & \int_{-f}^f |t|e^{2 i \pi s t} dt = \frac{2 \pi s f \sin(2 \pi s f) + \cos(2 \pi s f) - 1}{2\pi^2 s^2}. \end{eqnarray*}$$
4. Intégration numérique
En pratique on ne peut envoyer qu'un nombre fini de rayons.On va donc pouvoir obtenir la transformée de Radon de \(\mu\) pour seulement \(n_\phi\) angles \((\phi_i)_{i=0..(n_\phi-1)}\) et \(n_s\) distances au centre \((s_j)_{j=0..(n_s-1)}\).
On a donc pour données la matrice \((R_\mu(\phi_i,s_j))_{\substack{i=0..(n_\phi-1)\\ j=0..(n_s-1)}}\).
Afin de pouvoir utiliser le thèorème FBP donné dans la section précédente, il va donc falloir réaliser une intégration numérique. Pour ce faire, le plus simple est d'utiliser des angles et distances au centre à pas constant. Autrement dit on aura \(\phi_i = \frac{i}{n_\phi}\pi\) et \(s_j = -1 + 2\frac{j}{n_s-1}\).
On utilise alors une méthode de quadrature du type suivant : $$\begin{eqnarray*} \int_a^b f(x) dx & \simeq & \frac{b-a}{n} \left( \sum_{k=0}^{n} f\left(a+k\frac{b-a}{n}\right) \right) \end{eqnarray*}$$ Ce qui donne alors dans notre cas en \(\rar{x} = (x,y)\) : $$\begin{eqnarray*}\highlight{ \mu(x,y) \simeq \frac{2\pi}{n_s n_\phi} \sum_{i=0}^{n_\phi} \sum_{j=0}^{n_s} R_\mu(\phi_i, s_j) r(x\cos(\phi_i) + y\sin(\phi_i) - s_j) }\end{eqnarray*}$$ Deux choses intéressantes à remarquer :
- Le calcul des \(\mu(x,y)\) est complètement parallélisable pour chaque pixel \(x,y\) à reconstruire.
- On peut afficher progressivement une image de plus en plus précise même si on a pas encore les lignes pour tous les angles.