使用 MATLAB 在 3D MRI 体积中创建中间切片

Creating intermediate slices in a 3D MRI volume with MATLAB

我有 9 张 MRI 图像,想用这些图像制作一个 3D 体积。从那里,我想在每个切片之间进行插值。给定体积中的两个切片,我想在两个切片之间插入一个中间帧。目标是创建一个执行此插值的 18 MRI 体积。

我如何在 MATLAB 中完成这个?

假设您的 MRI 图像处于 3D 堆叠体积中,您可以使用 interp3 完成您想要的。选择采样点时,切片的行和列将保持不变,但时间或 Z 方向的大小只会加倍。所以像这样,假设 MRI 是你的音量:

[rows,cols,slices] = size(MRI);
[X,Y,Z] = meshgrid(1:cols, 1:rows, 1:slices);
[X2,Y2,Z2] = meshgrid(1:cols, 1:rows, 0.5:0.5:slices);
out = interp3(X, Y, Z, MRI, X2, Y2, Z2, 'linear', 0);

以上将生成一个具有两倍切片的体积,保持行和列相同并使用双线性插值。额外的 0 确保如果我们创建的值超出原始采样点,我们会将这些点外推到 0。

如果您的图像不是 3D 体积,您需要将其放入 3D 矩阵中。假设他们被称为 MRI1 直到 MRI9,你可以这样做:

MRI = cat(3, MRI1, MRI2, MRI3, MRI4, MRI5, MRI6, MRI7, MRI8, MRI9);

然后就可以使用上面的代码了。完成后,您可以通过以下方式获取中间切片:

final_slices = MRI(:,:,1:2:end);

然后您可以使用 final_slices 访问每个中间切片。


作为一个简单的例子,让我们假设我们的体积是 3 x 3 x 3 体积中的一堆随机数:

rng(123123);
MRI = rand(3,3,3)

MRI(:,:,1) =

    0.3002    0.8302    0.1768
    0.9946    0.7214    0.0678
    0.2901    0.4627    0.5201


MRI(:,:,2) =

    0.2323    0.8516    0.7838
    0.3251    0.5326    0.6377
    0.7220    0.4735    0.0717


MRI(:,:,3) =

    0.3202    0.1259    0.3360
    0.1004    0.9260    0.6287
    0.6922    0.3191    0.9011

运行上面的插值代码,我们得到:

out(:,:,1) =

     0     0     0
     0     0     0
     0     0     0


out(:,:,2) =

    0.3002    0.8302    0.1768
    0.9946    0.7214    0.0678
    0.2901    0.4627    0.5201


out(:,:,3) =

    0.2662    0.8409    0.4803
    0.6598    0.6270    0.3527
    0.5060    0.4681    0.2959


out(:,:,4) =

    0.2323    0.8516    0.7838
    0.3251    0.5326    0.6377
    0.7220    0.4735    0.0717


out(:,:,5) =

    0.2763    0.4887    0.5599
    0.2127    0.7293    0.6332
    0.7071    0.3963    0.4864


out(:,:,6) =

    0.3202    0.1259    0.3360
    0.1004    0.9260    0.6287
    0.6922    0.3191    0.9011

如您所见,代码确实正确地创建了中间切片。您会看到每个偶数位置都是原始 MRI 图像之一,而奇数位置是插值结果。第一个切片没有任何意义,因为我们正试图从已知体积之外进行推断。您可能希望专注于第三个切片及其之后的奇数位置,直到新卷结束。