RadonKA.jl offers two different geometries right now. See also this pluto notebook
The simple and default interface is RadonParallelCircle
. This traces the rays parallel through the volume.
However, only rays inside a circle of the image are considered.
See also the RadonParallelCircle
docstring.
The essence is the specification of a range or vector where the incoming position of a ray is.
This is with respect to the center pixel at div(N, 2) +1
.
The first example is the default. Just a parallel ray geometry.
angles = [0]
# output image size
N = 200
sinogram = zeros((N - 1, length(angles)))
sinogram[1:5:end] .= 1
geometry_parallel = RadonParallelCircle(N, -(N-1)÷2:(N-1)÷2)
projection_parallel = backproject(sinogram, angles; geometry=geometry_parallel);
simshow(projection_parallel)
sinogram_small = zeros((99, length(angles)))
sinogram_small[1:3:end] .= 1
geometry_small = RadonParallelCircle(200, -49:49)
projection_small = backproject(sinogram_small, angles; geometry=geometry_small);
simshow(projection_small)
See also the RadonFlexibleCircle
docstring.
This interface has a simple API but is quite powerful.
The first range indicates the position upon entrance in the circle.
The second range indicates the position upon exit of the circle.
geometry_fan = RadonFlexibleCircle(N, -(N-1)÷2:(N-1)÷2, range(-(N-1)÷4, (N-1)÷4, N-1))
projected_fan = backproject(sinogram, angles; geometry=geometry_fan);
simshow(projected_fan, γ=0.01)
geometry_extreme = RadonFlexibleCircle(N, -(N-1)÷2:(N-1)÷2, zeros((199,)))
projected_extreme = backproject(sinogram, angles; geometry=geometry_extreme);
simshow(projected_extreme, γ=0.01)
For example, if in your application some rays are stronger than others you can include weight factor array into the API.
geometry_weight = RadonParallelCircle(N, -(N-1)÷2:(N-1)÷2, abs.(-(N-1)÷2:(N-1)÷2))
projection_weight = backproject(sinogram, angles; geometry=geometry_weight);
simshow(projection_weight)
The ray gets some attenuation with exp(-μ*x)
where x
is the distance traveled to the entry point of the circle. μ
is in units of pixel.
projected_exp = backproject(sinogram, angles; geometry=geometry_extreme, μ=0.04);
simshow(projected_exp)
The ray gets some attenuation with exp(-μ*x)
where μ
varies spatially.
To represent this spatial variation, we can simply use an array for μ.
μ = 0.5 .* box((N, N), (2, 50));
simshow(μ)
projected_1 = backproject(sinogram, angles, μ=μ);
projected_2 = backproject(sinogram, angles .+ π / 4, μ=μ);
[simshow(projected_1) simshow(projected_2)]