CT x-ray scanner

From Noah.org
Revision as of 10:51, 13 December 2007 by Root (talk | contribs)
Jump to navigationJump to search

CAT Scanning

I'd like to build a CAT Scanner. It turns out that the software isn't that hard. The algorithm is quite simple. Here are some sample images that illustrate the process. Since I don't yet have the hardware to generate x-ray slices of an object I have synthesized what an x-ray would yield if it scanned an object. These scans are then reassembled to yield the original target image.

In a real CAT Scan system the 1 dimensional slices would be taken from the horizontal row of a series of x-rays. In this demo I don't yet have the x-rays to work with so I synthesize the 1D bands from the target image that I want to regenerate. So given a target image I generate a series of 1D radial slices by rotating the target image and then averaging all values in the rows of the image. Then I rotate the slice back to the original angle.

Slices are synthesized from a 180 degree rotation of the target image.

Relative position of each scan slice
The target and four
1-dimensional sections.
The position of the
sections corresponds to
the angle of projection.
target.png section 4 0.png
section 4 3.png section 4 2.png section 4 1.png

Add (overlay) the four 1D radial sections together to get the CAT scan image at the right.

section 4 0.png+section 4 3.png+section 4 2.png+section 4 1.png = target 4 out.png

The resulting CAT scan is reminiscent of the target, but it is ambiguous. I found that you need at least 8 sections to get a recognizable image. The more sections you use the better. Here is a composite of 8 and 32 radial sections:

target 8 out.png target 32 out.png

This technique will work with very complex images. Given a photograph I synthesized 32 1-dimensional scans and then regenerated the photograph using the CAT algorithm.

A more complex example

target n.png target n out.png target n out enhanced.png

The real world of x-rays is not so simple. In the experiments above, I actually synthesize the radial sections by averaging all the pixels in the rows. This roughly approximates how an x-ray reveals average density of a line through the target. But in the real world there can be materials inside the target that are so dense that they totally block x-ray energy. This reconstruction technique assumes that every part of a target is at least somewhat transparent. If there are parts of a target that are totally opaque even to x-rays then this will result in ambiguous, hidden sections. These hidden sections not only hide what is inside of them, but they also cause shadows that distort areas outside.

The following target is similar to the one used before except that it now has a screen added. The algorithm that synthesizes the radial sections was modified to treat any red are as totally opaque. The result is that anything inside the cup shaped screen is totally hidden. The dense area also throws off the contrast so that it is difficult to see the notch at the top of the target, but you can more or less make it out.

targeto.png targeto out.png


Image processing

The image that results from the composite of the 1D sections has very low contrast. It is simple to expand the dynamic range of the image, but also note that the contrast is weighted towards the center. This is because the radial sections favor the center of the image. The center of the target has the most overlapping sections so the pixels near the center contribute more signal to the average. It's difficult to apply a uniform contrast enhancement over the entire image because the result will leave the edges too dark or the center too light. What is needed is contrast enhancement that will be weighted based on the distance from the center of the image.

Source code

This is a rough draft of the source code written in Python. It requires the PIL module for image manipulation.

Click here to download: brainmaze.py <include svncat src="file:///home/svn/src/python/x-ray_cat_scan/cat_scanner.py" highlight="python" />