目录

  • 1、DICOM四视图
  • 2、vtkImageViewer2 实现二维平面图显示
  • 3、vtkVolume实现三维体数据显示
  • 4、实现界面图

1、DICOM四视图

DICOM四视图通常指同时显示医学影像的四个不同平面或视角,用于全面分析三维数据(如CT、MRI等)。

标准四视图布局:

  • 横截面(Axial)
    水平切面,从上向下观察(类似传统CT/MRI的横断面切片)。
    显示解剖结构的横向分布,常用于定位病变。
  • 矢状面(Sagittal)
    垂直切面,从身体左侧向右侧观察(将人体分为左右两部分)。
    适用于观察脊柱、脑部中线结构等。
  • 冠状面(Coronal)
    垂直切面,从前向后观察(将人体分为前后两部分)。
    常用于评估肺部、骨盆或对称性结构。
  • 3D重建/MPR(Multi-Planar Reconstruction)
    三维体积渲染或斜切面重建,提供任意角度的视角。
    用于复杂解剖(如血管、骨骼)的可视化。

2、vtkImageViewer2 实现二维平面图显示

vtkImageViewer2:

vtkSmartPointer<vtkImageViewer2> Viewer = vtkSmartPointer<vtkImageViewer2>::New();
vtkSmartPointer<vtkGenericOpenGLRenderWindow> RW = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
vtkSmartPointer<vtkGenericRenderWindowInteractor> RWInteractor = vtkSmartPointer<vtkGenericRenderWindowInteractor>::New();Viewer->SetRenderWindow(RW);
Viewer->SetupInteractor(RWInteractor);

设置图像数据和其他设置:

Viewer->SetInputData(inputData);Viewer->SetColorLevel(100);
Viewer->SetColorWindow(800);Viewer->SetSliceOrientationToXY();   //横断面
Viewer->SetSliceOrientationToXZ();   //冠状面
Viewer->SetSliceOrientationToYZ();   //矢状面

实现图像翻转:
SetViewUp() 方法用于 设置 2D 视图的“向上”方向,即定义图像在屏幕坐标系中的朝向。该方法直接影响影像的显示方向,尤其在多平面重建(MPR)或非标准切面显示时至关重要。
调整 ViewUp 可以旋转或翻转影像,使其符合解剖学标准(如医学影像的“头朝上”显示)。

标准化解剖视图

  • 轴向切面(Axial):
    默认 ViewUp = (0, -1, 0)(DICOM 标准,患者的“前”方向指向屏幕上方)。
    SetViewUp(0, -1, 0); // 屏幕 Y 轴向下(符合医学影像惯例)
  • 矢状切面(Sagittal):
    SetViewUp(0, 0, 1); // 屏幕 Y 轴朝向患者头部
  • 冠状切面(Coronal):
    SetViewUp(0, 0, 1); // 屏幕 Y 轴朝向患者头部

SetPosition:方法用于 设置渲染窗口在屏幕上的显示位置(以像素为单位)。它控制的是 VTK 渲染窗口的左上角在屏幕坐标系中的坐标位置。
默认朝向原点 (0, 0, 0)

2D 影像视图通常用 SetParallelProjection(1)(正交投影)。
3D 视图用默认的透视投影。

vtkCamera* camera = Viewer->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->GetActiveCamera();
camera->SetViewUp(0, -1, 0);
camera->SetPosition(0, 0, -1); // 从 Z=Superior 方向看

把每个Viewer添加进对应的QtWidget:

ui->Widget->SetRenderWindow(RW);
ui->Widget->GetRenderWindow()->SetInteractor(RWInteractor);

渲染并交互

viewer->Render();
viewer->GetRenderWindow()->GetInteractor()->Start();

3、vtkVolume实现三维体数据显示

设置体数据:

vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New()
vtkSmartPointer<vtkRenderer> volumeRenderer = vtkSmartPointer<vtkRenderer>::New();

根据不同的应用平台,选择不用的RenderWindow类:

//常规应用
vtkSmartPointer<vtkRenderWindow> volumeRW = vtkSmartPointer<vtkRenderWindow>::New();
//跨平台应用
vtkSmartPointer<vtkGenericOpenGLRenderWindow> volumeRW = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
//Windows平台
vtkSmartPointer<vtkWin32OpenGLRenderWindow> volumeRW = vtkSmartPointer<vtkWin32OpenGLRenderWindow>::New();
//X11平台
vtkSmartPointer<vtkXOpenGLRenderWindow> volumeRW = vtkSmartPointer<vtkXOpenGLRenderWindow>::New();
//macOS平台
vtkSmartPointer<vtkCocoaRenderWindow> volumeRW = vtkSmartPointer<vtkCocoaRenderWindow>::New();

设置与RenderWindow匹配的Interactor:

vtkSmartPointer<vtkGenericRenderWindowInteractor> volumeRWInteractor = vtkSmartPointer<vtkGenericRenderWindowInteractor>::New();volumeRW->AddRenderer(volumeRenderer);
volumeRWInteractor->SetRenderWindow(volumeRW);

修改3D视图的投影方式:透视投影or正交(即平行)投影:

	volumeRenderer->GetActiveCamera()->ParallelProjectionOn();  //正交视图volumeRenderer->GetActiveCamera()->ParallelProjectionOff();  //投影视图//或者://flag = 1 或 true:启用平行投影(正交投影)//flag = 0 或 false:禁用平行投影(恢复为透视投影)volumeRenderer->GetActiveCamera()->SetParallelProjection(int flag);

添加至页面的QtWidget窗口:

ui->Widget->SetRenderWindow(volumeRW);
ui->Widget->GetRenderWindow()->SetInteractor(volumeRWInteractor);

设置映射器(Mapper):

//GPU
vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
//CPU
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
volumeMapper->SetInputData(InputData);
volumeMapper->Update();

定义了体数据(如 CT、MRI 或其他 3D 体数据)的 颜色、不透明度、光照、梯度 等属性,直接影响最终渲染效果:

vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->SetInterpolationTypeToLinear();
volumeProperty->ShadeOff();                     //Off/On:Turn Off/On Shadow Test

vtkVolumeProperty::SetScalarOpacity:基于 标量值 设置不透明度(控制不同组织的显示),显示骨骼or显示高密度流体等
vtkVolumeProperty::SetGradientOpacity:基于 梯度值 设置不透明度(突出边缘或界面),突出软组织边界or锐化流体界面等

//Set Opacity
vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
compositeOpacity->AddPoint(0.0, 0.00);   //标量值 0 → 不透明度 0(完全透明)
compositeOpacity->AddPoint(125, 0.50);   //标量值 125 → 不透明度 0.5
compositeOpacity->AddPoint(256, 1.00);   //标量值 256 → 不透明度 1(完全不透明)volumeProperty->SetScalarOpacity(compositeOpacity);vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
volumeGradientOpacity->AddPoint(0.0, 0.0);     // 低梯度(均匀区域)→ 透明
volumeGradientOpacity->AddPoint(100, 0.4);     // 中梯度(边界)→ 半透明
volumeGradientOpacity->AddPoint(200, 1.0);     // 高梯度(锐利边缘)→ 不透明volumeProperty->SetGradientOpacity(volumeGradientOpacity);

定义体数据的颜色映射,将标量值转换为可视化的颜色:

vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();
color->AddRGBPoint(0, 0., 0., 0.);
color->AddRGBPoint(125, 0.0, 1.0, 0.0);
color->AddRGBPoint(256, 1.0, 0.0, 0.0);volumeProperty->SetColor(color);

更新设置到volume:

volume->SetMapper(m_volumeMapper);
volume->SetProperty(volumeProperty);
volume->Update();

渲染:

volumeRenderer->AddVolume(volume);
volumeRenderer->ResetCamera();
volumeRW->Render();

4、实现界面图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87324.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87324.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87324.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Maps 安装使用教程

一、Google Maps 简介 Google Maps 是谷歌提供的地图服务&#xff0c;通过其 JavaScript API&#xff0c;开发者可以在网页中嵌入地图&#xff0c;添加标记、路径、地理编码、路线导航等功能&#xff0c;适用于位置展示、物流追踪、LBS 应用等场景。 二、获取 Google Maps API…

Nginx+Keepalived实现前台服务高可用

现阶段项目开发往往采用前后台分离&#xff0c;前台常用的技术有vue、react等&#xff0c;前台代码部署在nginx中&#xff0c;代码中配置了后台服务的网关地址&#xff0c;由网关向后台分发服务请求&#xff0c;架构示意图如下&#xff1a; 在上述架构图中&#xff0c;如果Ngin…

Gradio全解13——MCP协议详解(5)——Python包命令:uv与uvx实战

Gradio全解13——MCP协议详解&#xff08;5&#xff09;——Python包命令&#xff1a;uv与uvx实战 第13章 MCP协议详解13.5 Python包命令&#xff1a;uv与uvx实战13.5.1 uv核心亮点与常用命令1. uv介绍2. 安装与项目管理3. 脚本与工具4. Python版本与pip接口 13.5.2 uv核心指令…

OD 算法题 B卷【求最小步数】

文章目录 求最小步数 求最小步数 求从坐标零点到坐标点n的最小步数&#xff0c;一次只能沿着横坐标轴向左或向右移动2或3&#xff1b;途经的坐标点可以为负数&#xff1b; 输入描述: 坐标点n 输出描述: 从坐标零点移动到坐标点n的最小步数 n在【1,10^9】 示例1 输入&#xf…

Elasticsearch 集群升级实战指引—7.x 升级到 8.x

升级Elasticsearch集群从7.x到8.x是一项复杂且关键的任务&#xff0c;涉及重大版本变更&#xff08;如API调整、配置变更、安全功能强制启用等&#xff09;&#xff0c;可能影响集群的性能和稳定性。结合您提到的业务量增长导致索引写入变慢的问题&#xff0c;本指引不仅提供详…

JWT学习总结

文章目录 前置知识Authorization头部和 CookieCRSF攻击 JWT概念JWT认证流程使用Springboot整合JWTJwtUtil JWT案例控制器JWT拦截器注册拦截器结果 session VS Jwt 前置知识 Authorization头部和 Cookie Authorization 头部和 Cookie 是 HTTP 协议中两种不同的身份认证 / 信息…

阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025

近日&#xff0c;由阿里云消息团队发表的 Apache RocketMQ 创新论文被 CCF-A 类软件工程顶级会议 FSE 2025 Industry Track 录用。 ACM FSE&#xff08;The ACM International Conference on the Foundations of Software Engineering&#xff09;是享有盛誉的国际学术会议&…

定制WordPress管理后台

WordPress作为全球最流行的建站工具&#xff0c;因其灵活性和易用性受到广泛欢迎。许多服务器提供商都支持一键安装WordPress&#xff0c;例如Hostease&#xff0c;使新手用户也能轻松搭建属于自己的网站。然而&#xff0c;后台的默认设置可能无法完全满足不同用户的需求。定制…

REST API设计与Swagger:构建高效、易用的Web服务

引言 在现代Web开发中&#xff0c;REST API已成为不同系统间通信的标准方式。一个设计良好的REST API不仅能提高开发效率&#xff0c;还能改善用户体验。而Swagger&#xff08;现称为OpenAPI&#xff09;作为API文档和测试的强大工具&#xff0c;已经成为API开发中不可或缺的一…

一个非对齐访问的问题

1、引言 最近在编写代码时&#xff0c;出现了这样一个 bug。程序一跑&#xff0c;系统就崩溃了&#xff0c;报错是 bus error。 目标平台&#xff1a;ARM32 最终定位到出错的代码片段&#xff1a; *((uint32_t *)ptr) id;这里的 ptr 是一个非 4 字节对齐的地址&#xff01;&a…

【构造】P8976 「DTOI-4」排列|普及+

本文涉及知识点 构造 P8976 「DTOI-4」排列 题目背景 Update on 2023.2.1&#xff1a;新增一组针对 yuanjiabao 的 Hack 数据&#xff0c;放置于 #21。 Update on 2023.2.2&#xff1a;新增一组针对 CourtesyWei 和 bizhidaojiaosha 的 Hack 数据&#xff0c;放置于 #22。…

多路I/O转接服务器(select、poll、epoll)

多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是&#xff0c;不再由应用程序自己监视客户端连接&#xff0c;取而代之由内核替应用程序监视文件。 IO 多路转接方式比较&#xff1a; 常见的 IO 多路转接方式有&#xff1a;select、poll、epoll&#xff0c;他…

最新临时文件快传系统源码 轻量化 带后台

简介&#xff1a; 最新临时文件快传系统源码 轻量化 带后台 首发 轻松上传文件并生成提取码分享给他人&#xff0c;无需注册&#xff0c;方便快捷。 图片&#xff1a;

MyBatis多数据源动态连接工具类实现

这个DatabaseService工具类提供了动态创建MyBatis SqlSession的能力&#xff0c;可以灵活地连接到不同的数据库&#xff0c;非常适合需要动态切换数据源的场景。 package com.cmes.immp.device.utils;import lombok.SneakyThrows; import org.apache.commons.dbcp2.BasicDataS…

用亮数据 MCP 驱动 Trae 智能体:打造高效亚马逊商品采集与分析助手

本文适合希望快速构建数据驱动型智能体的开发者、数据工程师及 AI 产品设计者阅读 并非广告&#xff0c;希望本文可以帮助有需求的同学&#xff0c;祝大家天天开心 在数字时代&#xff0c;数据是决策与洞察趋势的关键。但移动互联网数据获取不易&#xff0c;传统爬虫技术面对复…

如何降低AIGC生成内容的重复率?五种免费降AI率的方法 (25年更新)

随着AI生成内容&#xff08;AIGC&#xff09;的普及&#xff0c;越来越多的学术写作依赖AI工具来生成论文和文章。然而&#xff0c;AI生成内容的查重率常常偏高&#xff0c;导致很多论文无法通过学术查重系统。为了解决这一问题&#xff0c;以下是五种有效的免费降AIGC率的方法…

小米YU7使用UWB技术,厘米级定位精准迎宾,安全防破解无感控车

当您双手抱着快递走向爱车时&#xff0c;车门自动解锁&#xff1b;当您站在前备箱前稍作停留&#xff0c;箱盖优雅升起——这不是科幻电影&#xff0c;而是小米YU7搭载UWB技术带来的真实体验。在2025年5月的小米15周年战略新品发布会上&#xff0c;雷军揭晓了这项革命性技术&am…

WPF学习(动画)

文章目录 一、图像变换 RenderTransform1、常见变换类型2、RenderTransform 的核心作用3、RenderTransform 的使用方式4、与 LayoutTransform 的对比5、在动画中的应用 二、 滚动的椭圆三、Storyboard放置位置1. **元素的 Resources 集合**2. **控件模板&#xff08;ControlTem…

Crossbar结构的排队策略

目录 一、概述 二、排队策略 三、输入排队结构(IQ) 3.1 结构特点 3.2 改进方案 四、输出排队结构&#xff08;OQ&#xff09; 五、输入输出联合排队结构(CIOQ) 六、输入交叉节点联合排队结构(CICQ) 一、概述 Crossbar是一种全连接的交换结构&#xff0c;由 MN 个交叉…

状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!

订单状态流转/播放器控制/游戏角色行为…一个模式搞定所有状态驱动型逻辑&#xff01; 经典场景&#xff1a;订单状态管理 假设你在开发一个外卖App&#xff0c;订单有以下状态&#xff1a; 等待接单已接单配送中已完成已取消 每个状态下&#xff1a; 显示的UI不同可执行的…