***************
Radon transform
***************

The radon transform is a technique widely used in tomography, where you reconstruct an object from its different projections. A projection for example the scattering data obtained as the output of a tomographic scan.

For more information:
    http://en.wikipedia.org/wiki/Radon_transform
    http://www.clear.rice.edu/elec431/projects96/DSP/bpanalysis.html
    
Forward transform
=================

First we load the Schepp-Logan phantom, a classic test image representing a tomographic scan.

.. ipython::

    In [1]: from scikits.image.io import imread

    In [1]: from scikits.image import data_dir

    In [2]: from scikits.image.transform import radon, iradon

    In [3]: from scikits.image.color import rgb2gray

    In [4]: import matplotlib.pyplot as plt

    In [5]: import matplotlib.cm as cm

    In [6]: image = rgb2gray(imread(data_dir + "/phantom.png"))

    In [7]: plt.title("original image");

    In [8]: plt.imshow(image, cmap=cm.Greys_r)

    @savefig radon_original_image.png width=4in
    In [9]: plt.show()


Let us illustrate the transform by looking at projections taken at specific angles.

.. ipython::

    In [10]: projections = radon(image, theta=[0, 45, 90])

    In [11]: plt.plot(projections);

    In [12]: plt.title("radon projections");

    In [13]: plt.xlabel("projection axis");

    In [14]: plt.ylabel("intensity");

    @savefig radon_projection_plot1.png width=4in
    In [15]: plt.show()

We are going to reconstruct an image from 180 (the default) of these projections.

.. ipython::

    In [16]: projections = radon(image)

    In [17]: plt.figure()

    In [18]: plt.title("radon projections");

    In [19]: plt.xlabel("projection axis");

    In [20]: plt.ylabel("intensity");

    In [21]: plt.plot(projections)

    @savefig radon_projection_plot2.png width=4in
    In [22]: plt.show()
    

We have now constructed various projections, line integrals of an image, at specific angles. This image is called a sinogram.

.. ipython::

    In [23]: plt.figure()
    
    In [24]: plt.title("sinogram");

    In [25]: plt.xlabel("projection axis");

    In [26]: plt.ylabel("intensity");

    In [27]: plt.imshow(projections)

    @savefig radon_sinogram.png width=4in
    In [28]: plt.show()

Inverse transform
=================
To reconstruct the image from this sinogram, we apply the inverse transform.

.. ipython::

    In [29]: reconstruction = iradon(projections)

    In [30]: plt.title("reconstructed image");

    In [31]: plt.imshow(reconstruction, cmap=cm.Greys_r)

    @savefig radon_reconstructed_image.png width=4in
    In [32]: plt.show()


