3D Slicer 制作个性化面具并导出保存为3D打印文件

3D 打印面具辅助标记也很常用,今天记录一下采用3D Slicer 基于结构像数据制作个性化面具的过程,直接上操作步骤。

1.打开3D Slicer 并加载数据

在这里插入图片描述

2.进入segment Editor 模块

在这里插入图片描述
按次序操作segment Editor模块的右侧菜单栏
(1)点击按键+Add,列表中会出现Segment_1的节点
在这里插入图片描述
(2)在segment Editor 模块菜单按照如下次序分别进行操作
》》基于阈值选中有效目标前景
在这里插入图片描述
①进入阈值调节菜单
②通过调节滑块位置改变阈值使得每一层中的前景图被选中(原理:每一层高于阈值的像素被选中,而低于阈值的不选),当阈值越小时每一层被选中的越多,阈值越大被选中的就越少,阈值过小会会使得更多周边噪声和背景被选中,阈值过大会使得有用前景被漏选。
合适的阈值调节准则:确保所有的有用前景被选中,可以有少许周边噪声。
在这里插入图片描述
③阈值调节合理后,点击apply可以查看应用设定阈值在图像层上的选中效果
在这里插入图片描述
④点击show3D可显示所有被选中的层得到的三维立体图,,并显示在3D视窗中。
在这里插入图片描述
(3)对选中前景进行平滑处理(去除背景噪声)
建议先做中值滤波去掉孤立散点,然后做高斯平滑
如:试验先做2次中值滤波平滑;
后做1次高斯平滑;
》》中值滤波操作步骤如下
做2次中值平滑处理
在这里插入图片描述
Smoothing method: Median(中值)
Kernel Size:核尺寸,值越大处理程度越大,计算时间也越长,一般建议2~3mm,过大的核就会过平滑而丢失有效信息。
在这里插入图片描述
可见,与处理前相比,每经过一次中值滤波处理以后,图像都变得更干净,且周边噪声更疼少,还保留了有效前景。
》》高斯平滑操作步骤如下
在这里插入图片描述
Smoothing method: Gaussian(高斯)
Kernel Size:核尺寸,值越大处理程度越大,计算时间也越长,一般建议1.2~3mm,过大的核就会过平滑而丢失有效信息。一般没有经验时可以先设置较小的核尺寸尝试,再逐步变大,当处理不合理(有效信息漏掉或者三维视图轮廓纹理丢失明细)可以通过撤销按键退回,直到处理满意为止。
在这里插入图片描述
(4)基于选中前景,制作面具
在这里插入图片描述
注意:
因为要制作面具,肯定是确保面具可以套在人的头上。也就是面具的内层是头皮,而头皮是我们选中的区域,也就需要设置segment_1为 inside surface (确保输出面具是基于头皮为内层,往外扩)。
如果只是想制作一个被试的头皮一定层厚的头模型,需要为 outside surface(确保输出头模是以头皮为外层,往里扩)
Medial surface: 输出头皮为中间层,同时往里和外扩。
Shell thichness:表示需要制作的面具厚度设置,一般3~5mm。面具制作一般需要3D打印用作辅助标记,厚度设置需要考虑打印材质和费用。
在这里插入图片描述
在这里插入图片描述
可见,基于头皮的一层壳做好了,内部还有一些独立的联通块。
(5)去内部无关联通块,并裁剪出满足要求的面具
》》去内部无关联通块,操作步骤如下
在这里插入图片描述
在这里插入图片描述
可见基于头皮的一层3mm的“头套“壳已经干干净净了。
》》采用剪刀工具,在3D视窗中裁剪出被试的面具
在这里插入图片描述
剪刀工具非常好使,在使用时,其裁剪的是立体图,不是单层,需要配合视图旋转调整使用,建议裁剪处围成的空间范围避免重叠,当误剪时可以撤销。
1)鼠标在3D视图中双击,可将3D视图变为放大图,并将视图中的“头套”调成侧视图
在这里插入图片描述
2)用剪刀减去后半部分并修剪下巴、额头、侧脸等部位,确保面具可以戴上。
在这里插入图片描述
3)在面具上抠洞,漏出双眼和固定绳孔
全脸半脸面具应有尽有,自由剪刀手。
在这里插入图片描述

3.将制作面具保存为可3D打印的模型文件

在这里插入图片描述
在这里插入图片描述
保存格式一般可以为OBJ、STL;输出文件坐标系,有RAS和LPS 两种,根据需要选中;设置好参数以后就可以点击Export按键将面具模型文件保存到指定路径了。
打开文件看看:
在这里插入图片描述

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用3D Slicer进行可视化的简单示例代码: ```python import numpy as np import slicer # 创建一个 vtkMRMLScene 对象 scene = slicer.mrmlScene # 创建一个 vtkImageData 对象 imageData = vtk.vtkImageData() imageData.SetDimensions(100, 100, 100) imageData.AllocateScalars(vtk.VTK_DOUBLE, 1) # 将图像数据填充为一个球体 for i in range(100): for j in range(100): for k in range(100): x = i - 50 y = j - 50 z = k - 50 if x**2 + y**2 + z**2 < 2500: imageData.SetScalarComponentFromDouble(i, j, k, 0, 1.0) # 创建一个 vtkMRMLScalarVolumeNode 对象,并将图像数据添加到该节点中 volumeNode = slicer.vtkMRMLScalarVolumeNode() volumeNode.SetName('Sphere') volumeNode.SetSpacing(1.0, 1.0, 1.0) volumeNode.SetImageData(imageData) scene.AddNode(volumeNode) # 创建一个 vtkMRMLSliceNode 对象,并将其添加到场景中 sliceNode = slicer.vtkMRMLSliceNode() sliceNode.SetName('Slice') sliceNode.SetOrientationToAxial() sliceNode.SetSliceOffset(50) scene.AddNode(sliceNode) # 创建一个 vtkMRMLSliceCompositeNode 对象,并将其添加到场景中 compositeNode = slicer.vtkMRMLSliceCompositeNode() compositeNode.SetName('Composite') compositeNode.SetForegroundOpacity(0.5) scene.AddNode(compositeNode) # 创建一个 vtkMRMLSliceCompositeWidget 对象,并将其添加到界面中 sliceWidget = slicer.modules.slice.widgetRepresentation().self() sliceWidget.setMRMLScene(scene) sliceWidget.setMRMLSliceNode(sliceNode) sliceWidget.setMRMLSliceCompositeNode(compositeNode) # 将体积节点添加到切片中 displayNode = slicer.vtkMRMLScalarVolumeDisplayNode() displayNode.SetAutoWindowLevel(0) displayNode.SetWindowLevelMinMax(-1000, 1000) scene.AddNode(displayNode) volumeNode.SetAndObserveDisplayNodeID(displayNode.GetID()) sliceNode.SetAndObserveVolumeNodeID(volumeNode.GetID()) ``` 这段代码创建了一个球体,并将其添加到3D Slicer中。它还创建了一个切片窗口,将球体添加到该窗口中,以便用户可以查看球体的切片。注意,该代码仅为示例,可以根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值