我叫 Lorenzo,是意大利的博士后研究员。我的工作与使用同步辐射的断层成像有关。这对我来说是一个新领域,我开始面对 Matlab 编写一些代码。
我对断层成像完全陌生,Matlab 向我展示了新的挑战。我的实际问题是从堆叠的平行图像投影中创建正弦图。对于不在现场的人员,正弦图是检测在检测器上的样本中特征位置的投影的映射,作为 X 射线束和样本之间角度的函数。
我从实验中得到的是一系列不同角度的 2D 射线照相,您可以将其视为一个矩形“体积”,其中尺寸分别是单个投影中的行数和列数,体积由角度。正弦图只是这个体积的横向切割。这意味着不是从侧面而是从顶部读取体积,因此我将创建一个新的图像数组,其尺寸是列数和投影,数组长度是投影中的行数。为了在这个实验中给出数字,我有 4000 个大小为 2048x1370 像素的投影,所以对于我的计算机技能来说,这是一个巨大的计算问题。
我需要你的帮助才能更快地执行一些操作。我的代码在第一部分分配了一个数组来包含所有图像,这是一个 34 Gb 数组,但我有 130 Gb RAM,所以没问题。执行此操作的代码使用了一个 imread 循环:
for i=2:num_proj
filename=strcat(path_im,list_proj(i).name);
image=imread(filename);
imArray(:,:,i)=image;
end
这不是最快的方法,现在创建这个数组需要 332 秒。我找到了几种解决方案来改善这一点,我会这样做。
第二步是划分一个平场(没有样本拍摄的图像)。我的代码采用平面并使用 imdivide 将数组中的每个图像划分为平面图像:
for i=1:size(imArray, 3);
imArray(:,:,i)=imdivide(imArray(:,:,i), flat);
end
这一步似乎很快,但它被称为 4000 次。你有什么建议吗?有没有更好的方法来执行它?
现在我最大的问题是如何以最快的方式在投影体积中进行水平切割?我的基本想法是从“顶部”读取音量。报告如下,它完成了它的工作,但是它需要很长时间:
for i=1:size(sinogram, 3)
for k=1:size(sinogram, 1)
sinogram(k,:,i)=imArray(i,:,k);
end
end
你能帮我加快这个操作吗?我希望我的问题很清楚,否则请询问,我会尝试更好地解释它。