如何从二维图像创建三维曲面



我一直在修改dicom图像,以便以后可以对其进行3d打印。问题是,一旦我修改了单个切片,将其转换为.stl文件,我使用的软件(Osirix)就会提示一个错误,要求提供大量数据。如果我尝试在不首先在MAtlab中修改的情况下呈现.stl,我不会收到错误消息。

我需要一个Matlab的代码示例,它可以将二维图像堆叠到三维曲面中,这样我以后就可以将其导入.stl文件。有人能帮我吗?

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

解决方案1.以下解决方案基于以下假设:1) 所有2d图像的大小相同:n1乘以n22) 您知道图像(切片)的数量:n33) 图像是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

让我知道这是否有帮助。

相关内容

  • 没有找到相关文章

最新更新