llnl / llnl/LEAP

How to do iterative reconstruction after the projection splicing obtained by modular projection beam?

Open
#159 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Cuda
Stars
249
Forks
37
PR merge metrics
No merged PRs in 30d

Description

Hi Kyle,

I have encountered some issues with iterative reconstruction of projections created by the `modularbeam` function recently.

I am trying to simulate a static CT imaging geometry with a fixed arc-shaped detector and a fixed arc-shaped ray source. Referring to your demo_9, I set up each module with only one detector unit, and by combining multiple modules, I formed the arc-shaped detector. I defined the coordinates for each module of the detector and ensured that each module corresponds to the same ray source position. By using the `set_modularbeam` function and forward projection function, I obtain the projection for a single ray source position, and then by looping through all ray source positions, I get the projections for each ray source position. Finally, I stitch them together to get the final projection.

However, there is an issue: each time the loop runs, the `set_modularbeam` function saves the imaging geometry for only a single ray source position, which does not correspond to the complete imaging geometry for the final projection. I am unsure how to directly apply the iterative algorithm for reconstruction on the final projection.

I hope to receive some guidance from you. Thank you!

```

moduleCenters = np.zeros((numSticks,3),dtype=np.float32)
colVectors = np.zeros((numSticks,3), dtype=np.float32)
rowVectors = np.zeros((numSticks,3), dtype=np.float32)
rowVectors[:,2] = 1
for m in range(numSticks):
colVectors[m,0] = -np.cos(alphas[m])
colVectors[m,1] = np.sin(alphas[m])
moduleCenters[m,0] = odd*np.sin(alphas[m])
moduleCenters[m,1] = -odd*np.cos(alphas[m])
for n in range(numAngles): ##Different angles correspond to different ray source positions
phi = phis[n]*np.pi/180-np.pi/2
sourcePositions = np.zeros((numSticks,3),dtype=np.float32)
sourcePositions[:,0] = sod*np.sin(phi)
sourcePositions[:,1] = sod*np.cos(phi)
sourcePositions[:,2] = 0
leapct_true.set_modularbeam(numSticks, numRows, numCols_per_module, pixelSize, pixelSize, sourcePositions, moduleCenters, rowVectors, colVectors)
g_sim = leapct_true.allocateProjections() # shape is numAngles, numRows, numCols
# "Simulate" the data
leapct_true.project(g_sim,phantom)
# Concatenate the projections onto each modular into one projection
for m in range(numSticks):
g[n,:,m*numCols_per_module:(m+1)*numCols_per_module] = g_sim[m,:,:]

```

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with demo_9 and the documented set_modularbeam, allocateProjections, and project entry points. Compare the single-source-position loop with the stitched projection layout, then determine the supported iterative-reconstruction workflow for this modular geometry. Done means establishing a reproducible way to reconstruct the final projection or clearly documenting the limitation.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, python
Domain
computer-vision
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.