【问题标题】:How to create a 3d surface from 2d images?如何从 2d 图像创建 3d 表面?
【发布时间】:2015-06-24 18:36:09
【问题描述】:

我一直在修改 dicom 图像,以便以后进行 3D 打印。问题是,一旦我修改了各个切片以将它们转换为 .stl 文件,我正在使用的软件 (Osirix) 会提示一个要求提供体积数据的错误。如果我尝试渲染 .stl 而不先在 MAtlab 中对其进行修改,我不会收到任何错误消息。

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

【问题讨论】:

    标签: matlab multidimensional-array stl


    【解决方案1】:

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

    解决方案 1. 以下解决方案基于以下假设: 1)所有二维图像的大小相同:n1 by 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
    

    让我知道这是否有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      相关资源
      最近更新 更多