创建用于3d打印的STL股骨表面模型
这个例子展示了如何将分割掩码从CT图像转换为适合3d打印的STL表面模型。
医学图像数据的3d打印涉及多个临床应用和研究领域:
使用患者特定解剖模型的手术治疗计划。
制造定制义肢,植入物,或手术工具。
组织和器官生物打印。
3-D打印可以创建计算机生成的表面模型的物理模型。从医学图像体中3d打印解剖结构的典型工作流程包括以下步骤:
分割感兴趣的区域,如骨头、器官或植入物。
将分割掩码转换为由人脸和顶点定义的三角曲面。
将三角测量写入STL文件,这是大多数商用3d打印机所接受的。
将STL文件导入3d打印软件,打印模型。
这个示例将股骨的面具转换为三角形表面,并写入适合3d打印的STL文件。
下载镜像卷数据
这个例子使用了股骨的二进制分割掩码。该面具是通过从医疗分割十项全能肝脏数据集中分割CT扫描而创建的[1使用the医学图像标签有关如何分割医学图像卷的示例,请参见使用医学图像标签器标记3-D医学图像.
控件中标记图像时医学图像标签,应用程序将分割掩码保存为NIfTI文件。方法可以找到在应用程序会话中生成的掩码的文件路径LabelData
的属性groundTruthMedical
从会话导出的对象。
此示例下载股骨掩码作为数据集的一部分,该数据集包含原始腹部CT容量以及股骨和肝脏掩码。从MathWorks®网站下载数据集,然后解压缩文件夹。
zipFile = matlab.internal.examples.downloadSupportFile(“医疗”,“MedicalVolumeLiverNIfTIData.zip”);filepath = fileparts(zipFile);unzip(zipFile,filepath) dataFolder = fullfile(filepath,“MedicalVolumeLiverNIfTIData”);
指定股骨掩码的文件名。
文件名= fullfile(数据文件夹,“Femur.nii”);
负载CT分割掩码
导入股骨面具通过创建medicalVolume
对象为NIfTI文件。图像数据存储在体素
财产。的VoxelSpacing
属性指示体素是各向异性的,大小为0.7 × 0.7 × 5.0 mm。
medVol = medicalVolume(文件名)
medVol = medicalVolume with properties: Voxels: [512×512×75 uint8] VolumeGeometry: [1×1 medicalref3d] SpatialUnits: "mm" Orientation: "横向" VoxelSpacing: [0.7031 0.7031 5] NormalVector: [0 0 1] NumCoronalSlices: 512 NumSagittalSlices: 512 NumTransverseSlices: 75 PlaneMapping:["矢状" "冠状" "横向"]Modality: "unknown" WindowCenters: 0 WindowWidths: 0
的VolumeGeometry
属性medicalref3d
对象,该对象指定空间引用信息。提取medicalref3d
对象转换为一个新的变量,R
.
R = medVol.VolumeGeometry;
提取股骨等值面
指定等值面提取的等值。
等值= 0.05;
提取顶点和面,这些顶点和面定义了图像体积在指定等值面的等值面。
[faces,vertices] = extractIsosurface(medVol.Voxels,isovalue);
的顶点
输出提供了内在的ijk-曲面点的坐标,以体素为单位。在本征坐标中创建顶点的三角剖分。
triInstrinsic =三角剖分(双(面),双(顶点));
如果显示定义的曲面顶点
从内在坐标来看,股骨表面被压扁了。内在坐标不能解释真实世界的体素维度,并且本例中的体素在第三维中比在前两个维中更大。
viewerIntrinsic = viewer3d;obj = images.ui.graphics3d.Surface(viewerIntrinsic,Data=triInstrinsic,Color=[0.88 0.84 0.71],Alpha=0.9);
将顶点转换为患者坐标
为了准确地表示股骨表面的点,变换ijk坐标在顶点
定义的病人坐标系medicalref3d
对象,R
.的X
,Y
,Z
输出定义xyz-表面点的坐标,单位为毫米。
I = vertices(:,1);J =顶点(:,2);K =顶点(:,3);[X,Y,Z] = intrinsicToWorld(R,I,J,K);verticespatientcods = [X Y Z];
对变换后的顶点进行三角剖分,verticesPatientCoords
.所定义的原始连通性脸
.
triPatient =三角测量(double(faces),double(verticesPatientCoords));
显示由转换后的患者坐标定义的曲面。股骨表面不再受压。
viewerPatient = viewer3d;obj = images.ui.graphics3d.Surface(viewerPatient,Data=triPatient,Color=[0.88 0.84 0.71],Alpha=0.9);
创建STL文件
函数的长度对应于曲面中的顶点数点
财产。
triPatient
triPatient =三角测量属性:点:[21950×3 double] ConnectivityList: [43896×3 double]
方法可以减少表示曲面所需的三角形数量,同时保留关联对象的形状reducepatch
函数。将股骨表面三角形的数量减少50%。的reducepatch
函数返回一个带字段的结构脸
而且顶点
.
reduce = reducepatch(faces,verticesPatientCoords,0.5);
对缩小的表面进行三角剖分。顶点的数目,由点
属性中的顶点数的一半triPatient
.
triReduced =三角剖分(double(duce .faces),double(duce .vertices))
triReduced =三角测量属性:点:[10976×3 double] ConnectivityList: [21948×3 double]
显示缩小的表面,以验证股骨的形状是保留的。
viewerPatient = viewer3d;obj = images.ui.graphics3d.Surface(viewerPatient,Data=triReduced,Color=[0.88 0.84 0.71],Alpha=0.9);
方法将表面数据写入STL格式文件stlwrite
函数。
Name =“Femur.stl”;stlwrite (triReduced名称)
您可以使用STL模型文件作为大多数商用3d打印机的输入,以生成股骨的物理3-D模型。这张图片显示了STL文件的3d打印。
参考文献
医学细分十项全能。“肝”。任务。2018年5月10日访问。http://medicaldecathlon.com/.
医疗细分十项全能数据集是在CC-BY-SA 4.0许可下提供的。所有保证和声明均被放弃。详细信息请参见license。