We are trying to reconstruct SPECT datasets with attenuation correction.
In the software guide, the implementation of projection and backprojection algorithms is presented in section 1.3.1:
"NiftyRec is based on an implementation of the rotation-based projection and backprojection algorithm proposed by Zeng and Gullberg"
In this article, they explain that for the backprojector, there is no need to introduce correction attenuation and it reduces the computation time.
In the NiftyRec implementation, we have noticed that there is a difference with this article. Indeed the attenuation is taken into account both in the projection and backprojection procedures.
If an "attenuation_image" is given as input, we have seen in the source code that the attenuation correction is applied twice during the projection and the backprojection steps, according to these lines:
- In the file "_et_line_integral_attenuated.cpp", the correction is applied at this line:
> sino_data[x + y*activityImage->nx] = sino_data[x + y*activityImage->nx] + activity_data[index]*exp(-sum_attenuation);
- In "_et_line_backproject_attenuated.cpp", the correction is applied like this:
> bkpr_data[index] = sino_data[x + y*bkprImage->nx]*exp(-sum_attenuation);
We would have two questions:
- Is it a choice in NiftyRec to apply a correction also for the backprojection whereas it is not required in the Zeng and Gullberg paper? Is it in order to have a better result?
- During the backprojection step, the voxel value is calculated in "_et_line_backproject_attenuated.cpp" at line 31:
> bkpr_data[index] = sino_data[x + y*bkprImage->nx]*exp(-sum_attenuation)
We have not understood why the multiplication term is "exp(-sum_attenuation)" instead of "exp(+sum_attenuation)".
Indeed, if we consider a very attenuated voxel (for instance at the center of the object), we believe that its value should enhanced.
This is a point that we have not understood.
Could you please give us informations about this?
Thanks a lot,