[Rtk-users] Implementing a Motion-Compensated SART (MCSART) Reconstruction

Simon Rit simon.rit at creatis.insa-lyon.fr
Thu Apr 17 16:48:20 CEST 2025


Hi Ryan,
If you check our code, the normalization step is quite simplistic to avoid
a backprojection: we simply calculate and divide by the length of the
intersection between each ray and the "image box" (parallelepiped
corresponding to the space occupied by the volume) using the
rtk::RayBoxIntersectionImageFilter
<https://www.openrtk.org/Doxygen/classrtk_1_1SARTConeBeamReconstructionFilter.html>.
This is exactly what you should get if you forward project a volume of 1
with our Joseph forward projectors. See the diagram from the implementation
of SART:
https://www.openrtk.org/Doxygen/classrtk_1_1SARTConeBeamReconstructionFilter.html
Maybe you can try to do the same here?
For what you want to do, it would be better to use a forward and
backprojector combining the projection and a vector field... We have it
available for the backprojection
<https://www.openrtk.org/Doxygen/classrtk_1_1FDKWarpBackProjectionImageFilter.html>
and for the forward
<https://www.openrtk.org/Doxygen/classrtk_1_1ForwardWarpImageFilter.html>,
maybe we should try to implement it in the SART command line application
for you... I have opened an issue to track this:
https://github.com/RTKConsortium/RTK/issues/721
Cheers,
Simon


On Mon, Apr 14, 2025 at 6:25 PM Andosca, Ryan <RAndosca at mednet.ucla.edu>
wrote:

> Hi,
>
> So, my experience with coding, especially in C, is extremely limited. I
> mostly work in MATLAB, and as such I've been primarily using the built-in
> console applications to perform reconstruction on CBCT datasets. The
> rtksart application works great and provides a beautiful reconstruction. My
> goal is to effectively do the same reconstruction, but tack on motion
> compensation to each iteration.
>
> After delving into the algorithm implementation in rtksart as much as I am
> able, I wrote a MATLAB workflow that boils down to:
>
>    - Start with image of zeros
>    - Randomize gantry angle order
>    - Iterate over gantry angles:
>    - Load current projection forward and backward motion compensation DVFs
>       - Deform current image iteration to current gantry angle breathing
>       state
>       - Forward project deformed image
>       - Subtract deformed projections from raw CBCT image data
>       - Back project the subtraction image
>       - NORMALIZE BACK PROJECTION (this is where I think my issue is)
>       - Deform normalized back projection back to the original image space
>       - Update current image: img = img + lambda *
>       (normalized_back_projection / number_of_gantry_angles)
>       - Note: This step, as it also contains normalization, may also be a
>          source of my issue...
>          - Set negatives to 0
>       - Repeat
>
>
> I get an image that is much as I expect - a much sharper diaphragm and
> generally higher definition in soft tissue structures. So I must be
> generally on the right track. The issue is that the normalization is
> clearly off in some way. I have a bright circle artifact in the middle of
> the image and some striping throughout. Try as I might to understand it, I
> couldn't discern how normalization was done in the rtksart application. So,
> this is the method I used:
>
>    - Create an image of 1s of the size of the final (SART reconstructed)
>    image.
>    - Forward project through this image of 1s
>    - Back project through the resulting forward projection
>    - In the normalization step in the MCSART process detailed above, I
>    simply divide by this resulting back projection.
>
>
> Knowing all of that, any idea what my issue might be leading to my
> artifacts? Ultimately, I know it would be more ideal if I just altered the
> rtksart application itself to include motion compensation, and then I'd
> just be using the built-in normalization that clearly works, but I find my
> abilities lacking when I attempt to do this... So instead I am just seeking
> to understand how that application implements normalization, so that I can
> use a similar normalization in my algorithm!
>
> I greatly appreciate any help provided!
>
> Best,
> R. Andosca
> GSR
> UCLA Health
>
>
>
>
>
> ------------------------------
>
> UCLA HEALTH SCIENCES IMPORTANT WARNING: This email (and any attachments)
> is only intended for the use of the person or entity to which it is
> addressed, and may contain information that is privileged and confidential.
> You, the recipient, are obligated to maintain it in a safe, secure and
> confidential manner. Unauthorized redisclosure or failure to maintain
> confidentiality may subject you to federal and state penalties. If you are
> not the intended recipient, please immediately notify us by return email,
> and delete this message from your computer.
> _______________________________________________
> Rtk-users mailing list
> rtk-users at openrtk.org
> https://www.creatis.insa-lyon.fr/mailman/listinfo/rtk-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.creatis.insa-lyon.fr/pipermail/rtk-users/attachments/20250417/5966d456/attachment.htm>


More information about the Rtk-users mailing list