How to do iterative reconstruction after the projection splicing obtained by modular projection beam?
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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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