我一直致力于制作dicom图像,以便稍后我可以打印它们。问题是,一旦我修改了单个切片以将它们变成.stl文件,我使用的软件(Osirix)会提示一个错误,要求输出体积数据。如果我尝试渲染.stl而不首先在MAtlab中修改它,我得到没有错误消息。
我需要一个Matlab代码示例,它可以将2d图像堆叠到3d表面中,以便稍后将其导入.stl文件。谁能帮我?
答案 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
如果这有帮助,请告诉我。