我有9张MRI图像,并希望用这些图像制作3D体积。从那里,我想插入每个切片之间。给定卷中的两个切片,我想在两个切片之间插入一个中间帧。目标是创建一个18个MRI体积来执行此插值。
我将如何在MATLAB中实现这一目标?
答案 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图像之一,而奇数位置是插值结果。第一个切片并不意味着什么,因为我们试图从已知体积外推断。您可能希望在此点之后专注于第三个切片及其奇数位置,直到新卷结束。