使用 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 图像之一,而奇数位置是插值结果。第一个切片没有任何意义,因为我们正试图从已知体积之外进行推断。您可能希望专注于第三个切片及其之后的奇数位置,直到新卷结束。
我有 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 图像之一,而奇数位置是插值结果。第一个切片没有任何意义,因为我们正试图从已知体积之外进行推断。您可能希望专注于第三个切片及其之后的奇数位置,直到新卷结束。