bea*_*yez 0 matlab interpolation image-processing multidimensional-array
我有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);
Run Code Online (Sandbox Code Playgroud)
以上将生成一个具有两倍切片的卷,保持行和列相同并使用双线性插值.额外0
确保如果我们创建的值超出原始采样点,我们将这些点推断为0.
如果您的图像不是 3D体积,则需要将其放入3D矩阵中.假设他们是所谓的MRI1
最多MRI9
,你可以这样做:
MRI = cat(3, MRI1, MRI2, MRI3, MRI4, MRI5, MRI6, MRI7, MRI8, MRI9);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用上面的代码.完成后,您可以通过执行以下操作来获取中间切片:
final_slices = MRI(:,:,1:2:end);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用访问每个中间切片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
Run Code Online (Sandbox Code Playgroud)
运行上面的插值代码,我们得到:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,代码肯定会正确创建中间切片.您会看到每个偶数位置都是原始MRI图像之一,而奇数位置是插值结果.第一个切片并不意味着什么,因为我们试图从已知体积外推断.您可能希望在此点之后专注于第三个切片及其奇数位置,直到新卷结束.
归档时间: |
|
查看次数: |
2172 次 |
最近记录: |