1

我有一个 nifti (.nii) 图像的数据集。理想情况下,我希望能够从每个图像中获取相同体素/元素的值,并将函数应用于 n 个数据点。我想为整个图像中的每个体素/元素执行此操作,以便我可以将结果重新转换回 .nii 格式。

我使用NIfTI 和 ANALYZE 图像工具箱的工具来加载我的图像:

data(1)=load_nii('C:\file1.nii');
data(2)=load_nii('C:\file2.nii');
...
data(n)=load_nii('C:\filen.nii');

我从中获得了一个结构对象,每个子字段都包含一个已加载的 nifti。其中每一个都有一个与我要处理的图像数据相对应的子字段“img”。问题来自于尝试在 data(1) 到 data(n) 的每个 img 字段中选择给定的 xyz。正如我发现的那样,不可能以这种方式进行选择:

data(:).img(x,y,z)

或者

data(1:n).img(x,y,z)

因为matlab不支持。第一个括号的内容必须是标量才能使调用起作用。谷歌搜索的解决方案似乎是一个创建临时变量的循环:

for z = 1:nz
    for x = 1:nx
        for y = 1:ny
            for i=1:n;
                points(i)=data(i).img(x,y,z);
            end
            [p1(x,y,z,:),~,p2(x,y,z)] = fit_data(a,points,b);
        end
end
end

这可行,但是对于给定大小为 nx、ny、nz(每个数百个)的一组图像需要太长时间(几天)。

我一直在寻找加快代码速度的解决方案,我相信这取决于通过矢量化删除这些循环,预选 img 字段(通过 getfield ?)并将它们连接起来,并应用诸如 arrayfun/cellfun/structfun 之类的东西,但我坦率地说,我对如何做到这一点有点迷失。我只能想办法预先选择哪些自己需要循环,这似乎违背了练习的目的(尽管循环较少或至少嵌套循环较少的解决方案可能会这样做),或者对同一个问题感兴趣像 data(:).img(x,y,z) 这样的调用不起作用。再次谷歌搜索正在抛出选择和连接结构内的字段或跨多个结构的给定字段的方法。但我找不到任何问题:从结构对象的子结构中的非标量子字段中选择一个元素(循环最少)。最后,我需要输出采用矩阵的形式,上面的工具箱可以将其转换回 nifti。

非常感谢任何和所有建议、线索、提示和帮助!

4

1 回答 1

0

You can concatenate images as a 4D array and use linear indexes to speed up calculations:

img = cat(4,data.img);
p1 = zeros(nx,ny,nz,n);
p2 = zeros(nx,ny,nz);
sz = ny*nx*nz;
for k = 1 : sz 
    points = img(k:sz:end);
    [p1(k:sz:end),~,p2(k)] = fit_data(a,points,b);
end
于 2018-04-23T19:57:20.070 回答