an interface and some tools for computed tomography reconstruction
Project description
CTRECON: Some basic simulation tools for CT scanning
More than "fast" or "efficient", I'm trying to bolt an interface on that feels intuitive and reusable. Something I want to reach for when developing a question. The implemented math that backs this stuff should be swappable over time as better implementations are developed.
Environment setup
The package is available exclusively via pip. We strongly recommend using an environment manager (virtualenv, conda, micromamba, uv, etc.) to track and manage your dependencies.
pip install ctrecon
If you get a warning that matplotlib cannot show the window, you may also need
to install a different backend for matplotlib (e.g., pip install PtQt5).
Refer to the matplotlib
documentation
if you encounter any issues.
Hello world example
This example comes from the package's "unit tests". They're not actually unit tests because they're interactive, but they're great sanity checks to see if and how the package runs on your computer:
from ctrecon import phantoms, scanners, tools, images
if __name__ == "__main__":
target_support_size = 50 # cm
# These parameters are for a rough approximation
# of a clinical Definition AS 64
R_si = 59.5 # cm
R_sd = 109.5 # cm
n_channels = 736 # number of detector elements
det_size = target_support_size / n_channels
phantom = phantoms.DebugPhantom()
scanner = scanners.PencilBeamScanner(59.5, 109.5, n_channels, det_size)
sinogram, projection_metadata = scanner.scan(phantom)
center_x = 0.0
center_y = 0.0
fov = 30.0
N = 256
sinogram_noisy = tools.add_noise(sinogram, 1000)
image = images.DebugImage(center_x, center_x, fov, N)
image.set_debug_info(phantom, sinogram, sinogram_noisy, scanner)
image.reconstruct(scanner, sinogram, projection_metadata)
image.display()
The idea is to apply some sane logical structure the many components required to go from simulated phantom, to CT sinogram, and back to image. My hope is that using the library feels like describing the experiment you're doing with normal language, and your code makes it feel obvious what experiment is being done.
phantomscontains prebaked phantoms, as well as the tools to build your ownscannerscontains prebaked scan geometries, and the interface classes (ScanGeometry) to build your own (and preserve compatibility with the rest of the toolchain).imagescontains different image geometriestoolsonly containsadd_noisefor now, which may migrate elsewhere at some point
BYO Phantom
This is the full definition of our DebugPhantom:
class DebugPhantom(Phantom):
def __init__(self):
# tuneable elements, units are cm
bg_attenuation = 0.0192
ph_radius = 10.0
elements = []
bg = Circle(0, 0, ph_radius, bg_attenuation)
findable_insert_1 = Circle(0, 5, 3.0, 0.04)
findable_insert_2 = Circle(5, 0, 1.5, 0.04)
# Intuitively, we draw from "bg" -> "fg"
elements.append(bg)
elements.append(findable_insert_1)
elements.append(findable_insert_2)
# When raycasting, its most efficient to intersect the fg first
elements.reverse()
# Save the elements of the phantom
self.circles = elements
The concept is that we basically draw objects into the world space. We calculate sinograms via raycasting and each step iterates through the list of objects to check if we're inside. For that increment, we utilize the attenuation of the first object in the list that we encounter and move on.
The same phantom can be completely described via CSV as well. Note that the row order sets the object "precedence" in the sinogram generation process.
debug_phantom.csv:
5,0,1.5,0.04
0,5,3.0,0.04
0,0,10.0,0.0192
You can save a phantom a CSV file:
from ctrecon import phantoms
ph = phantoms.DebugPhantom()
ph.to_csv('debug_phantom.csv')
A phantom can be instantiate from such a CSV:
debug_ph = Phantom.from_csv("debug_phantom.csv")
This at least describes phantoms in a mostly portable manner. Free to use in other places and between research groups.
Only circles are supported for now. I hope to extend to other shapes in the near future.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ctrecon-0.0.2.tar.gz.
File metadata
- Download URL: ctrecon-0.0.2.tar.gz
- Upload date:
- Size: 23.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd8cb70bf8abd9b5486d355eb1c2c8a4c7272bf8dbf74d43c80da95f99c743ea
|
|
| MD5 |
6b53967f060c1116e58a100bbbb7ecdc
|
|
| BLAKE2b-256 |
91efa6af297efb5e009776ba4a82e6ecfaea0ca90e927bd1ee126db5acdc7ea3
|
File details
Details for the file ctrecon-0.0.2-py3-none-any.whl.
File metadata
- Download URL: ctrecon-0.0.2-py3-none-any.whl
- Upload date:
- Size: 19.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7210e88e2621679df68bbd0587f3f38294d70f2803c3bf03b1e42e346d43d2b
|
|
| MD5 |
3de120b24842c711d76ea17205d03fc7
|
|
| BLAKE2b-256 |
42a2a96ae463e51dc4fb84160634f3a96f97bb1a81b32cc15e99cfebb540d05a
|