news 2026/4/25 0:51:11

MedicalDemo4 体素绘制与展示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MedicalDemo4 体素绘制与展示

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①vtkFixedPointVolumeRayCastMapper体素渲染,②体渲染的其它内容


二:代码及注释

import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkIOImage import vtkMetaImageReader from vtkmodules.vtkRenderingCore import vtkColorTransferFunction, vtkRenderer, vtkRenderWindow, \ vtkRenderWindowInteractor, vtkVolume, vtkVolumeProperty from vtkmodules.vtkRenderingVolume import vtkFixedPointVolumeRayCastMapper from vtkmodules.vtkCommonCore import vtkLookupTable from vtkmodules.vtkCommonDataModel import vtkPiecewiseFunction def main(): colors = vtkNamedColors() colors.SetColor('BkgColor', [51, 77, 102, 255]) file_name = "Data/FullHead.mhd" reader = vtkMetaImageReader() reader.SetFileName(file_name) reader.Update() """ vtkFixedPointVolumeRayCastMapper TK 体绘制(Volume Rendering)中非常经典的体渲染算法类, 尤其在需要 高精度但又相对高效的 CPU 光线投射渲染 时使用。 它通过计算光线穿过体积数据时的累积颜色与透明度,实现 半透明体渲染 效果,通俗的讲,它不是绘制表面,而是“看透体积”的渲染器 """ volume_mapper = vtkFixedPointVolumeRayCastMapper() volume_mapper.SetInputConnection(reader.GetOutputPort()) # 建立标量与颜色之间的对应关系 volume_color = vtkColorTransferFunction() volume_color.AddRGBPoint(0, 0.0, 0.0, 0.0) volume_color.AddRGBPoint(500, 240.0 / 255.0, 184.0 / 255.0, 160.0 / 255.0) volume_color.AddRGBPoint(1000, 240.0 / 255.0, 184.0 / 255.0, 160.0 / 255.0) volume_color.AddRGBPoint(1150, 1.0, 1.0, 240.0 / 255.0) """ vtkPiecewiseFunction 定义标量值(scalar)到“单个实数值”(通常是透明度或强度)的映射关系, 并通过分段线性插值(piecewise linear interpolation)实现平滑过渡 """ # 标量透明度 volume_scalar_opacity = vtkPiecewiseFunction() volume_scalar_opacity.AddPoint(0, 0.00) volume_scalar_opacity.AddPoint(500, 0.15) volume_scalar_opacity.AddPoint(1000, 0.15) volume_scalar_opacity.AddPoint(1150, 0.85) """ 将体素强度的梯度(变化率)作为输入,将不透明度(Opacity)作为输出 在3D体积数据中,梯度测量的是体素强度在单位距离内变化的速度和方向 低梯度(0~90): 发生在均匀的区域内,例如纯净的空气,软组织内部等 高梯度(90, 100) 发生在组织边界,例如软组织过度到谷歌表面,组织过度到空气的表面 如果没有梯度不透明度函数,体积渲染的结果看起来就像一团“云雾” 标量不透明度函数 (volume_scalar_opacity) 已经为骨骼设置了较高的不透明度,但这仍可能导致骨骼看起来模糊且缺乏锐利的表面 解决方案: 通过这个梯度函数,我们明确告诉渲染器:“只有在体素强度发生急剧变化的地方(即物体的表面边界),才将其设置为高不透明度。” 有效地抑制了体素内部的“噪声”或细节,并突出了体素间的过渡边界 """ # 梯度透明度 volume_gradient_opacity = vtkPiecewiseFunction() volume_gradient_opacity.AddPoint(0, 0.0) volume_gradient_opacity.AddPoint(90, 0.5) volume_gradient_opacity.AddPoint(100, 1.0) """ vtkVolumeProperty 是 VTK 体绘制(Volume Rendering)管线中最核心的类之一, 它定义了 体数据在渲染时的视觉属性(颜色、透明度、光照、插值方式等) 可以把它理解为三维体的“材质(Material)” + “视觉属性(Visual Property)” 控制器 """ volume_property = vtkVolumeProperty() volume_property.SetColor(volume_color) volume_property.SetScalarOpacity(volume_scalar_opacity) volume_property.SetGradientOpacity(volume_gradient_opacity) """ SetInterpolationTypeToLinear 设置体素差值方式为线性插值 在体积渲染的光线投射过程中,光线会沿着一条直线穿过体素(Voxel)。 Mapper 需要在光线上的许多非整数体素坐标点进行采样(即在体素的中心之间取值) 如果不设置或设置为最近邻插值,采样点的值将直接采用其最近的那个体素中心的值。 这会导致渲染结果出现明显的方块状、锯齿状的伪影,因为体素的边界被清晰地显示出来 """ volume_property.SetInterpolationTypeToLinear() volume_property.ShadeOn() # 开启着色 volume_property.SetAmbient(0.4) # 设置环境光, 控制在没有直接光源照射到的地方,物体表面仍能看到的基本亮度 volume_property.SetDiffuse(0.6) # 控制物体表面对光的普遍反射。这是形成物体主要颜色和形状的关键因素 0.6 使物体的基本颜色和纹理细节清晰可见 volume_property.SetSpecular(0.2) # 设置镜面反射,意味着物体表面有一定的光泽,但不会像镜面那样反射出强烈的高光 """ vtkVolume 体对象类(Volume Actor) 是体渲染中最顶层、最关键的“场景对象”之一,它是你最终放进 Renderer 里看到的“3D体对象” 一个 vtkVolume 对象由两个主要部分组成 Property: vtkVolumeProperty 控制体渲染的外观(颜色、透明度、光照等) 决定渲染的算法 Mapper: vtkVolumeMapper 控制体渲染算法(如何从数据生成影像) 决定渲染的外观 可搭配的Mapper vtkSmartVolumeMapper 自动选择最佳渲染器 推荐首选 vtkGPUVolumeRayCastMapper GPU 光线投射 快速、现代GPU加速 vtkFixedPointVolumeRayCastMapper CPU 光线投射 CPU版,可用于无GPU环境 """ volume = vtkVolume() volume.SetMapper(volume_mapper) volume.SetProperty(volume_property) render = vtkRenderer() render.AddViewProp(volume) renderWindow = vtkRenderWindow() renderWindow.AddRenderer(render) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renderWindow) camera = render.GetActiveCamera() c = volume.GetCenter() camera.SetViewUp(0, 0, -1) camera.SetPosition(c[0], c[1] - 400, c[2]) camera.SetFocalPoint(c[0], c[1], c[2]) camera.Azimuth(30.0) camera.Elevation(30.0) render.SetBackground(colors.GetColor3d('BkgColor')) # Increase the size of the render window renderWindow.SetSize(640, 480) renderWindow.SetWindowName('MedicalDemo4') # Interact with the data. iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 10:08:39

ConstrainedDelaunay2D 顺逆时针限制三角剖分

一:主要的知识点 1、说明 本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客 2、知识点纪要 本段代码主要涉及的有①平面生成Delaunay2D注意事项,…

作者头像 李华
网站建设 2026/4/22 3:22:42

昇腾CANN开源仓生态体验与开源商业版差异深度解析

摘要 本文基于昇腾AI实战经验,深度解读CANN开源仓生态,剖析其架构设计与核心能力,对比开源版与商业版差异,并结合真实项目分享参与体验。通过性能分析图表、实战代码示例与企业级案例,揭示CANN在模型训练/推理中的软硬…

作者头像 李华
网站建设 2026/4/24 4:42:20

基于视频空间认知的高敏感资产智能管控关键技术研究

一、项目基本信息项目名称: 基于视频空间认知的高敏感资产智能管控关键技术研究本项目聚焦弹药库、特种物资仓库等高敏感资产存储场景,围绕“空间认知—行为理解—决策推演”这一核心技术主线,开展系统性、方法论层面的关键技术研究&#xff…

作者头像 李华
网站建设 2026/4/23 17:51:30

基于PyTorch的行人重识别流程改造与实现

基于PyTorch的行人重识别流程改造与实现 在智能监控系统日益普及的今天,如何从海量视频流中快速定位特定目标,已成为城市安防、行为追踪等场景中的核心需求。其中,行人重识别(Person Re-Identification, ReID) 技术扮…

作者头像 李华
网站建设 2026/4/24 22:00:53

揭秘Open-AutoGLM部署全流程:如何30分钟内完成本地化部署与调试

第一章:Open-AutoGLM本地化部署概述Open-AutoGLM 是基于 AutoGLM 架构开源的大语言模型,支持自然语言理解、代码生成与多模态任务处理。其本地化部署方案为企业和开发者提供了数据隐私保护、低延迟响应以及定制化模型优化的能力,适用于金融、…

作者头像 李华
网站建设 2026/4/24 12:49:15

‌教工系统二次开发怎么做好个性化定制?这几步很关键

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

作者头像 李华