1. CT正反投影模块的核心价值
在医学影像处理领域,CT图像重建是个经典问题。传统方法里,正投影(Forward Projection, FP)和反投影(Back Projection, FBP)是两个关键步骤。简单来说,正投影就是把3D物体"拍扁"成2D投影数据的过程,就像我们用X光拍片;反投影则是反过来,从多个角度的投影数据重建出3D图像。
但传统方法有个大问题:它们是不可微分的黑盒子。这意味着当我们想把它们嵌入到深度学习网络里时,梯度没法顺利传播。想象一下,你在搭积木,但中间有几块积木是胶水粘死的,没法调整——这就是传统FP/FBP在神经网络里的处境。
PyTorch的自动微分机制给了我们新思路。通过用PyTorch重新实现这些模块,我们能让梯度自由流动,让整个系统可以端到端训练。我在实际项目中发现,这种可微分模块特别适合用在像SIN(Sinogram Inpainting Network)这样的架构里,它能同时处理投影域和图像域的信息,大幅提升重建质量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 正投影模块的PyTorch实现
2.1 旋转与插值的艺术
正投影的核心是旋转+累加。具体来说,就是把图像旋转到不同角度,然后沿一个方向求和。听起来简单,但用PyTorch实现时有几个坑要注意。
首先是旋转。PyTorch的grid_sample函数是我们的好朋友,它支持可微分的双线性插值。但要注意坐标系转换——CT图像通常以中心为原点,而PyTorch的网格坐标是归一化的[-1,1]。我踩过的坑是忘记调整坐标,结果图像旋转后位置偏移。
python复制def forward(self, x):
sino = torch.zeros(self.batchSize, 1, self.chanNum, self.viewNum).cuda()
for i in range(self.viewNum):
angle = -math.pi + 2*math.pi*i/self.viewNum # 均匀采样0-360度
theta = torch.tensor([
[math.cos(angle), -math.sin(angle), 0],
[math.sin
