我一直在修改dicom图像,以便以后可以对其进行3d打印。问题是,一旦我修改了单个切片,将其转换为.stl文件,我使用的软件(Osirix)就会提示一个错误,要求提供大量数据。如果我尝试在不首先在MAtlab中修改的情况下呈现.stl,我不会收到错误消息。
我需要一个Matlab的代码示例,它可以将二维图像堆叠到三维曲面中,这样我以后就可以将其导入.stl文件。有人能帮我吗?
一种方法可以是将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
让我知道这是否有帮助。