3. MRI重建中的傅里叶变换工程实现

在MRI重建链路中,k空间采样数据与图像域像素之间由二维傅里叶变换对连接。工程实现上,我们不会真的去计算连续积分,而是把离散采样点交给FFT/IFFT。但“调用一次FFT”远不等于“得到正确图像”:采样轨迹是否落在规则网格、相位方向是否一致、零填充与缩放是否处理得当,都会直接改变最终图像。本节围绕k空间到图像域的数值细节展开,重点讲清FFT/IFFT的工程约定、非笛卡尔采样下的网格化(gridding)与去网格化(degridding),以及如何判断结果是否可信。

一、FFT/IFFT的工程约定:先定符号与缩放

MRI重建中常用约定是:图像域 I(x,y) 经二维傅里叶变换得到k空间 S(kx,ky),重建时对采样数据做逆变换。不同软件库对正变换与逆变换的符号、归一化因子定义不同,工程上必须固定一套约定并贯穿始终。以常见的实现为例:

# 约定:k空间 -> 图像域使用 ifft2,并做 fftshift 把零频移到中心
# 假设 ksp 为 [Ny, Nx] 的复数k空间数据,已按 ky 行、kx 列排列
img = np.fft.ifft2(np.fft.ifftshift(ksp))
img = np.fft.fftshift(img)   # 将零频移到图像中心,便于观察
img = img * (Nx * Ny)        # 若库的 ifft 自带 1/N 归一化,需乘回总点数

这里有两个容易出错的点。第一,fftshift 与 ifftshift 的方向:如果k空间采集时零频位于矩阵中心,进入FFT前必须用 ifftshift 把零频移到左上角,变换后再用 fftshift 移回中心;若顺序颠倒,图像会出现半个视野的平移。第二,归一化:NumPy的 ifft2 默认除以 Nx*Ny,而某些GPU库或C++实现不除,重建后整体亮度会差一个总点数因子。工程上建议在重建入口处显式记录“是否已归一化”,并在输出前统一乘回,避免后续定量分析(如SNR、T1拟合)被整体缩放污染。

二、规则笛卡尔采样:FFT直接可用,但要注意零填充

笛卡尔采样是最常见的情形:k空间按等间距 Δkx、Δky 采样,重建直接对补零后的矩阵做IFFT。零填充(zero-padding)不是“提高分辨率”,而是对图像做sinc插值,使像素网格更密、边缘更平滑。例如原始矩阵 256×256,补零到 512×512 后IFFT,图像仍是同一物理视野,但像素间距减半。判断零填充是否合理,可以看两点:一是图像边缘是否出现明显截断振铃,二是补零后像素值是否出现负值或过冲。若原始数据已加窗,补零带来的振铃会被抑制;若未加窗,补零只会让Gibbs伪影更显眼。

三、非笛卡尔采样:网格化与去网格化的核心作用

当采样轨迹为径向、螺旋或随机轨迹时,采样点不在规则网格上,不能直接调用FFT。此时需要网格化:把非均匀采样点“搬”到规则网格上,再对规则网格做FFT/IFFT。去网格化则是反向操作,用于把规则网格上的数据插值回非均匀轨迹,常见于迭代重建中的正向算子与伴随算子。工程实现中,网格化通常包含三步:密度补偿、卷积插值、网格FFT。

密度补偿用于修正采样密度不均。径向轨迹中心采样密、边缘稀疏,若不补偿,重建图像中心会过亮、边缘会过暗。常用做法是按轨迹半径计算密度权重 w(k),在网格化前乘到采样值上。卷积插值则用一个紧支撑核(如Kaiser-Bessel核)把每个非均匀点扩散到邻近的规则网格点。核的宽度与形状决定插值精度与计算量:核越宽,精度越高,但每个点影响的网格数越多。工程上常用核半径2~4个网格点,配合过采样因子1.5~2.0,即把规则网格建得比目标图像矩阵更大,以减少混叠。

非笛卡尔k空间重建:网格化与去网格化数据流 非均匀k空间采样 径向 / 螺旋 / 随机轨迹 采样点 (kx, ky) 非等间距 密度不均,中心密边缘疏 密度补偿 按半径计算权重 w(k) S(k) ← S(k) · w(k) 修正中心过亮/边缘过暗 卷积插值(网格化) Kaiser-Bessel核扩散 核半径 2~4 网格点 过采样因子 1.5~2.0 规则网格FFT/IFFT 对过采样网格做变换 再裁剪到目标矩阵 得到图像域 I(x,y) 去网格化(Degridding) 从规则网格插值回非均匀轨迹点 用于迭代重建的正向算子与伴随算子 工程判断要点 • 核宽度↑ → 精度↑、计算量↑;核太窄 → 混叠与伪影 • 过采样因子≥1.5 可显著降低网格化混叠,但内存与FFT时间增加 • 密度补偿缺失 → 图像中心过亮;补偿过度 → 边缘噪声放大 • 检查零频位置:fftshift/ifftshift 顺序错误 → 半视野平移 • 归一化因子未统一 → 整体亮度偏差 Nx·Ny 倍 • 重建后看背景噪声与边缘振铃,判断核与补偿是否合适

四、数值细节:从采样到图像的完整链路

把上述步骤串起来,一个典型的非笛卡尔重建流程是:读取轨迹与采样数据 → 计算密度补偿权重 → 将每个采样点用卷积核扩散到过采样规则网格 → 对网格做IFFT → 裁剪到目标矩阵并做fftshift → 输出图像。若用于迭代重建,还需要实现去网格化:给定规则网格上的估计图像,通过同样的核插值出非均匀轨迹上的预测值,与实测值比较后更新图像。正向算子与伴随算子的核必须一致,否则迭代不收敛。

数值上还有两个细节值得注意。第一,网格化后的数据是复数,卷积核通常为实数且归一化,保证总能量守恒;若核未归一化,重建图像整体亮度会随核宽度变化。第二,过采样网格的尺寸通常取目标矩阵的1.5~2倍,且最好为2的幂或5的倍数,以便FFT库高效计算。裁剪时只取中心目标矩阵大小的区域,相当于在图像域做低通滤波,抑制网格化引入的高频混叠。

五、结果判断与常见问题

重建完成后,判断结果是否可信可以从三个层面看。第一,背景区域:若背景出现明显条纹或网格状纹理,通常是网格化核太窄或过采样不足。第二,图像中心与边缘的亮度一致性:若中心过亮,说明密度补偿不足;若边缘噪声异常放大,说明补偿过度。第三,与笛卡尔参考重建对比:在相同采样时长下,非笛卡尔重建的分辨率与伪影水平应接近参考,若出现明显模糊或重影,需检查轨迹方向与FFT符号约定是否一致。

工程建议:在重建代码中固定一套“k空间→图像域”的符号与归一化约定,并在每次调用FFT前后打印矩阵尺寸、零频位置和缩放因子。对于非笛卡尔轨迹,先用一个已知的数值体模(如Shepp-Logan)验证网格化与去网格化的伴随一致性,再上真实数据。

总结来说,FFT/IFFT在MRI重建中不是黑盒。笛卡尔采样下要管好零填充、fftshift和归一化;非笛卡尔采样下要管好密度补偿、卷积核、过采样和去网格化。把这些数值细节固定成可复现的工程约定,才能让k空间到图像域的转换稳定、可解释、可验证。