如何从2d图像创建3D表面?

时间:2015-06-24 18:36:09

标签: matlab multidimensional-array stl

我一直致力于制作dicom图像,以便稍后我可以打印它们。问题是,一旦我修改了单个切片以将它们变成.stl文件,我使用的软件(Osirix)会提示一个错误,要求输出体积数据。如果我尝试渲染.stl而不首先在MAtlab中修改它,我得到没有错误消息。

我需要一个Matlab代码示例,它可以将2d图像堆叠到3d表面中,以便稍后将其导入.stl文件。谁能帮我?

1 个答案:

答案 0 :(得分:0)

一种方法是将2D图像堆叠成3D立方体图像。

解决方案1。 以下解决方案基于以下假设: 1)所有2d图像的大小相同:n1 n2 2)您知道图像(切片)的数量:n3 3)图像为uint8

您可以预先创建一个3D立方体:

allImgs = uint8(zeros(n1, n2, n3));

然后用aSlice图像填充第一个切片,执行:

allImgs(:, :, 1) = aSlice;

对于第二个,请执行:

allImgs(:, :, 2) = anotherSlice;

等等。

如果你有一个函数(如getMeASlice())为你获取切片,你可以从for循环中有效地调用它并填充它:

for k = 1:n3
    allImgs(:, :, k) = getMeASlice(your_params);
end

解决方案2。 您可以随时连接切片。假设你读了一片:

aSlice = imread('cameraman.tif');

然后你在代码上读到了另一个片段并希望将它堆叠到现有片段中,你可以这样做:

aSlice = cat(3, aSlice, imread('anotherimage.jpg'));

在第三维中连接新切片。只要你需要,你就可以继续这样做。

但请注意以下事项。与预分配变量和添加(填充)此类变量相比,连接速度非常慢。例如,如果比较以下两个脚本,第二个脚本要慢得多:

n1=256; n2=256; n3=200;
allImgs = uint8(zeros(n1, n2, n3));
aSlice = imread('cameraman.tif');

tic;
for k=1:n3
    allImgs(:,:,1)=aSlice;
end
fprintf(['Total time is: ' num2str(toc) '\n']);

tic;
allImgs=aSlice;
for k=2:n3
    allImgs=cat(3, allImgs, aSlice);
end
fprintf(['Total time is: ' num2str(toc) '\n']);

在我的电脑中提供以下内容:

Total time is: 0.0085632
Total time is: 0.89103

如果这有帮助,请告诉我。