网站建设情况说明书,wordpress 前台文章,教育公司 网站建设,外贸企业招聘目录VTK简介什么是体绘制#xff1f;体绘制效果图流程CodeQAReferenceVTK简介 VTK#xff08;Visualization Toolkit#xff09;是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具#xff0c;可以让用户创建和处理复杂的3D图形和数据可视…
目录VTK简介什么是体绘制体绘制效果图流程CodeQAReferenceVTK简介 VTKVisualization Toolkit是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具可以让用户创建和处理复杂的3D图形和数据可视化。VTK提供了多种算法如体绘制、剪切、切片、等值面、等值线、流线、轮廓线、纹理映射等可以处理各种类型的数据包括体数据、网格数据、点云数据等。VTK也提供了Python、Java等多种编程语言的接口方便用户在不同的环境中使用。 VTK的应用十分广泛包括医学图像处理、工程和科学可视化、计算流体动力学、地球科学、物理模拟等领域。由于其开源和免费的特点VTK被广泛应用于学术界和工业界并得到了许多用户和贡献者的支持和发展。 什么是体绘制 体绘制也称为三维重建区别于投影图像的三维重建直接利用体数据来生成二维图像的绘制技术。与面绘制不同的是体绘制技术不需要提取体数据内部的等值面它是一个对三维体数据进行采样和合成的过程。体绘制能够通过设置不透明度值来显示体数据内部的不同成分和细节。常用于人体CT图像通过设置不透明度来显示各种器官与组织。总的来说体绘制是包含体数据而面绘制则是让整个模型由多种多边形构成模型表面但内部是空的想要看到模型各个切面的数据还是需要使用体绘制。 体绘制效果图
超声图像大小尺寸为 208 x 240一共176张往z轴延伸。
流程
VTK体绘制渲染管线
#mermaid-svg-VWGTyaUHGYkQPrJY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY .error-icon{fill:#552222;}#mermaid-svg-VWGTyaUHGYkQPrJY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VWGTyaUHGYkQPrJY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VWGTyaUHGYkQPrJY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VWGTyaUHGYkQPrJY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VWGTyaUHGYkQPrJY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VWGTyaUHGYkQPrJY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VWGTyaUHGYkQPrJY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VWGTyaUHGYkQPrJY .marker.cross{stroke:#333333;}#mermaid-svg-VWGTyaUHGYkQPrJY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VWGTyaUHGYkQPrJY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY .cluster-label text{fill:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY .cluster-label span{color:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY .label text,#mermaid-svg-VWGTyaUHGYkQPrJY span{fill:#333;color:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY .node rect,#mermaid-svg-VWGTyaUHGYkQPrJY .node circle,#mermaid-svg-VWGTyaUHGYkQPrJY .node ellipse,#mermaid-svg-VWGTyaUHGYkQPrJY .node polygon,#mermaid-svg-VWGTyaUHGYkQPrJY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VWGTyaUHGYkQPrJY .node .label{text-align:center;}#mermaid-svg-VWGTyaUHGYkQPrJY .node.clickable{cursor:pointer;}#mermaid-svg-VWGTyaUHGYkQPrJY .arrowheadPath{fill:#333333;}#mermaid-svg-VWGTyaUHGYkQPrJY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VWGTyaUHGYkQPrJY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VWGTyaUHGYkQPrJY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VWGTyaUHGYkQPrJY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VWGTyaUHGYkQPrJY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VWGTyaUHGYkQPrJY .cluster text{fill:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY .cluster span{color:#333;}#mermaid-svg-VWGTyaUHGYkQPrJY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VWGTyaUHGYkQPrJY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}1. 将多张图像转化为vtkImageData2. 使用体绘制算法,本文用的是vtkGPUVolumeRayCastMapper3. vtkVolume4. vtkRenderer5. vtkRenderWindowvtkVolumeProperty设置颜色与不透明度SetColorSetScalarOpacityCode
import vtk# 定义图片读取接口
# 读取PNG图片就换成PNG_Reader vtk.vtkPNGReader()
Jpg_Reader vtk.vtkJPEGReader()
Jpg_Reader.SetNumberOfScalarComponents(1)
Jpg_Reader.SetFileDimensionality(3) # 说明图像是三维的
# 定义3D模型大小图像大小尺寸为 208 x 240, 一共176张
# 定义范围从0开始
Jpg_Reader.SetDataExtent(0, 207, 0, 239, 0, 175)
# 设置图像的存放位置
Jpg_Reader.SetFilePrefix(./imgs/)
# 迭代文件中所有图像, 图像命名格式为: 000.jpg开始到175.jpg, 03d代表三位字符串, 不够三位则左侧补0
Jpg_Reader.SetFilePattern(%s%03d.jpg)
Jpg_Reader.Update()
# 二进制数据排序按小端(LittleEndian)规则
Jpg_Reader.SetDataByteOrderToLittleEndian()
# 图像处理结束# 创建一个vtkRenderer对象用于显示渲染结果
renderer vtk.vtkRenderer()# 创建一个vtkRenderWindow对象用于显示vtkRenderer对象中的内容
render_window vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)# 创建一个vtkRenderWindowInteractor对象用于处理交互事件
interactor vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)# 应用体绘制算法生成三维模型
volume_mapper vtk.vtkGPUVolumeRayCastMapper()
volume_mapper.SetInputData(Jpg_Reader.GetOutput())# 定义颜色映射
color_transfer_function vtk.vtkColorTransferFunction()
# 越接近黑色0越暗, 越接近白色255越亮
color_transfer_function.AddRGBPoint(0, 0.0, 0.0, 0.0)
color_transfer_function.AddRGBPoint(255, 1.0, 1.0, 1.0)# 设置不透明度函数
opacity_transfer_function vtk.vtkPiecewiseFunction()
# 把像素值低于15的设置为透明, 去除黑色0, 白色255则不透明
threshold 15
for i in range(threshold):opacity_transfer_function.AddPoint(i, 0.0)
opacity_transfer_function.AddPoint(255, 1.0)# 设置vtkVolume参数
volume_property vtk.vtkVolumeProperty()
volume_property.SetColor(color_transfer_function)
volume_property.SetScalarOpacity(opacity_transfer_function)
# 是否开启阴影
# volume_property.ShadeOn()
# 设置线性插值方式
volume_property.SetInterpolationTypeToLinear()# 将vtkVolumeMapper、vtkVolumeProperty和vtkVolume组合在一起
volume vtk.vtkVolume()
volume.SetMapper(volume_mapper)
volume.SetProperty(volume_property)renderer.AddVolume(volume)
# 设置背景为白色
renderer.SetBackground(1.0, 1.0, 1.0)# 显示渲染结果
render_window.Render()
interactor.Start()
QA
Q: 如何过滤VTK模型中的背景/黑色部分/空气部分 A: 给vtkVolume的Property通过SetScalarOpacity函数设置opacity_transfer_function给不需要显示的组织的对应像素设置透明度为0即可过滤对应组织。
Reference
《VTK图形图像开发进阶》- 张晓东 罗火灵编著