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

时间:2015-02-23 05:14:48

标签: matlab image-processing multidimensional-array interpolation

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

我将如何在MATLAB中实现这一目标?

1 个答案:

答案 0 :(得分:5)

假设您的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图像之一,而奇数位置是插值结果。第一个切片并不意味着什么,因为我们试图从已知体积外推断。您可能希望在此点之后专注于第三个切片及其奇数位置,直到新卷结束。