【发布时间】:2016-01-18 19:00:49
【问题描述】:
我叫 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
你能帮我加快这个操作吗? 我希望我的问题很清楚,否则请询问,我会尽力解释得更好。
【问题讨论】:
-
我建议在 Computational Science 交流中提问:scicomp.stackexchange.com 这是一个相当复杂的数学问题,你可能会在那儿获得更好的运气。
-
我还是很乐观,我已经在这里找到了很多我的问题的答案:) 我会听从你的建议,我也会在那里问...
-
也只是在 CT-area 开始一个项目。有没有办法从点云对象 STL 数据创建图像投影?
标签: performance matlab tomography-reconstruction