SimpleITK——创建nrrd体素模型

在介绍如何生成nrrd前,了解一下为什么医学影像上一般使用nrrd的体素模型?

为什么医学影像上一般使用nrrd的体素模型?

在医学影像领域,‌NRRD(Nearly Raw Raster Data)格式‌被广泛用于存储体素模型(如CT、MRI数据),主要基于以下技术优势:


‌1. 灵活的数据存储方式‌

  • ‌支持原始数据无损存储‌
    NRRD可直接存储未经压缩的体素数据(如16位整型、32位浮点),避免DICOM等格式的二次编码损失,适合科研和精准医疗。
  • ‌多维数据兼容性‌
    可处理3D体素(CT/MRI)、4D时序数据(如fMRI、心脏动态扫描)甚至更高维数据(如DTI纤维追踪)。

‌2. 强大的元数据支持‌

  • ‌关键医学参数嵌入‌
    通过文本头文件(Header)记录:
    • 体素间距(spacings:如 0.5mm×0.5mm×1.0mm
    • 空间方向矩阵(space directions,用于对齐DICOM坐标系)
    • 患者体位标识(如LPS/RAS坐标系)
  • ‌可扩展性‌
    支持自定义字段(如扫描协议、厂商参数),比DICOM更轻量但足够专业。

‌3. 跨平台与开源生态‌

  • ‌无专利限制‌
    相比DICOM(需授权),NRRD为开源格式,兼容ITK、VTK、3D Slicer等主流医学软件。
  • ‌简化预处理流程‌
    直接存储已重建的体素矩阵,省去DICOM多层文件合并的步骤,加速AI模型训练(如nnUNet直接读取NRRD)。

‌4. 与其他格式的对比‌

特性NRRDDICOMNIfTI
‌数据维度‌支持任意维度单层2D为主3D/4D
‌元数据灵活性‌高(自定义字段)高(但结构复杂)中(固定字段)
‌坐标系支持‌明确空间方向需计算固定(RAS/LPS)
‌适用场景‌科研/算法开发临床归档神经影像(fMRI)

‌典型应用场景‌

  • ‌放射治疗规划‌:NRRD存储的CT体素数据可直接用于剂量计算(如RayStation)。
  • ‌深度学习‌:MONAI等框架默认支持NRRD,便于加载标注数据(如image.nrrd+label.nrrd)。
  • ‌三维重建‌:通过VTK将NRRD转换为STL模型用于3D打印。

‌注意事项‌

    • ‌临床兼容性‌:医院PACS系统通常仍以DICOM为主,NRRD多用于科研后端。
    • ‌压缩选项‌:NRRD支持GZIP压缩(如*.nhdr+*.raw.gz),但会牺牲部分读写速度。

以上是愚通过ds了解到的一些情况,仅供参考。

代码实现

以下为调用SimpleITK实现将Dicom文件转化为Nrrd体素模型的示例:

 public class DicomToNRRDHelper{/// <summary>/// DICOM序列转化为NRRD文件/// </summary>/// <param name="dicomDirectory">dicom文件路径</param>/// <param name="outPutFilename">包含路径和后缀名,且后缀名必须为.NRRD(因为需要以体素渲染)</param>/// <returns>失败为false;成功为true</returns>[MethodImpl(MethodImplOptions.Synchronized)]public static bool DicomToNRRD(string dicomDirectory, string outPutFilename){// 输入验证if (!Directory.Exists(dicomDirectory)){NlogHelper.Logger.Error($"Directory not found: {dicomDirectory}");return false;}if (!outPutFilename.EndsWith(".nrrd", StringComparison.OrdinalIgnoreCase)){NlogHelper.Logger.Error("Output file must have .nrrd extension");return false;}Image image3D = null;try{var seriesIDs = ImageSeriesReader.GetGDCMSeriesIDs(dicomDirectory);if (seriesIDs == null || seriesIDs.Length == 0){NlogHelper.Logger.Error($"No DICOM series found in: {dicomDirectory}");return false;}var seriesFileNames = ImageSeriesReader.GetGDCMSeriesFileNames(dicomDirectory, seriesIDs[0]);NlogHelper.Logger.Debug($"Processing {seriesFileNames.Count} DICOM files");if (seriesFileNames.Count > 1){using var reader = new ImageSeriesReader();reader.SetFileNames(seriesFileNames);image3D = reader.Execute();}else if (seriesFileNames.Count == 1){using var reader = new ImageFileReader();reader.SetFileName(seriesFileNames[0]);image3D = reader.Execute();}else{return false;}// 保留原始像素类型using var filter = new CastImageFilter();// 保留原始像素类型选项filter.SetOutputPixelType(image3D.GetPixelID());using var convertedImage = filter.Execute(image3D);using (var writer = new ImageFileWriter()){writer.SetFileName(outPutFilename);writer.Execute(convertedImage);}NlogHelper.Logger.Info($"Successfully created: {outPutFilename}");return true;}catch (Exception ex){NlogHelper.Logger.Error(ex, $"Failed to convert DICOM to NRRD");return false;}finally{image3D?.Dispose();}}}

注意事项

  1. SimpleITK中涉及到image、reader、writer最好都显示释放一下或 使用using语句,以达到使用完及时回收这些非托管资源。尽量不要依赖于它们在终结器中通过调用dispose的相关方法来实现资源回收,这个在实际项目中有过惨痛教训(资源不能及时回收,导致非托管对象无限增长,最终导致程序崩溃)。
  2. 对于非托管对象的释放,特别是在try catch语句中,若异常时容易忽略,尽量在finally中处理一下。
  3. 日志要尽量完善,如文件的长度检测;文件路径的检测;文件名的规范性检测等待

以上需要在实际开发中引起注意。

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

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

相关文章

Docker容器部署KES

一、安装部署 1&#xff0c;导入镜像 #导入镜像&#xff08;root用户&#xff09; [rootnode docker ]# mv kdb_x86_64_V008R006C009B0014.tar kingbase.tar [rootnode docker]# docker load -i kingbase.tar#查看镜像&#xff08;root用户&#xff09; [rootnode docker]# d…

C++基础练习 sort函数,用于排序函数

题目&#xff1a; https://acm.hdu.edu.cn/showproblem.php?pid2039 解答&#xff1a; #include <iostream> #include <cmath> #include <algorithm> using namespace std;double a[3]; int main(){int n;cin>>n;while(n--){cin>>a[0]>>…

棱镜观察|EMB“重构”卡钳,车企降本压力与Brembo困局

传统制动卡钳市场&#xff0c;正在迎来变革时刻。 一直以来&#xff0c;采埃孚、大陆集团、日立安斯泰莫等外资供应商占据中国乘用车卡钳前装市场&#xff08;包括前制动卡钳和后集成EPB卡钳&#xff09;的半壁江山。同时&#xff0c;伯特利、亚太股份、万向、弗迪等中国供应商…

《颠覆传统:CSS遮罩的图像创意设计指南》

想象有一块神奇的模板&#xff0c;上面有各种形状的镂空区域&#xff0c;当我们将这块模板覆盖在图像上时&#xff0c;只有透过镂空区域才能看到图像的部分&#xff0c;而模板遮挡的地方则被隐藏起来&#xff0c;这便是CSS遮罩的核心概念。遮罩&#xff0c;简单来说&#xff0c…

5.基于神经网络的时间序列预测

近年来&#xff0c;已经开发了一些深度学习方法并将其应用于单变量时间预测场景&#xff0c;其中时间序列由在等时间增量上按顺序记录的单个观测数据组成。 5.1 将深度学习用于时间序列预测的原因 机器学习的目标是提取特征来训练模型。模型将输入数据&#xff08;例如图片&am…

【软考高级系统架构论文】论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

什么是水平扩展

什么是水平扩展 在现代系统架构设计中&#xff0c;可扩展性&#xff08;Scalability&#xff09;是衡量系统面对业务增长时应对能力的重要指标。而“水平扩展”&#xff08;Horizontal Scaling&#xff09;&#xff0c;又称为“横向扩展”或“扩容节点”&#xff0c;正是应对高…

掌握openpyxl:Excel自动化处理全指南

openpyxl基础用法 openpyxl 是一个用于处理 Excel 文件&#xff08;.xlsx/.xlsm&#xff09;的 Python 库&#xff0c;支持读取、修改和创建 Excel 文档。以下是其常见用法的详细介绍&#xff1a; 一、基础操作&#xff1a;打开与保存文件 from openpyxl import load_workbo…

FastGPT:开启大模型应用新时代(4/6)

摘要&#xff1a;FastGPT是一种基于大语言模型&#xff08;LLM&#xff09;的知识库问答系统&#xff0c;致力于提供高效、精准的自然语言处理服务。它允许用户构建本地知识库以增强AI的理解能力&#xff0c;通过将用户的问题与知识库信息匹配推理&#xff0c;生成有针对性的回…

在MyBatis中$和#有什么区别

在 MyBatis 中&#xff0c;${} 和 #{} 是两种处理 SQL 参数的占位符&#xff0c;它们在实现机制、安全性、使用场景上存在显著差异。以下是详细对比&#xff1a; 核心区别对比 特性#{}${}底层机制预编译占位符&#xff08;PreparedStatement&#xff09;字符串直接替换安全性…

湖北理元理律师事务所债务优化方案:平衡还款与生活的法律实践

在个人债务问题日益突出的当下&#xff0c;如何科学规划还款路径成为社会性难题。湖北理元理律师事务所基于多年实务经验&#xff0c;提出“可持续债务优化”模型&#xff0c;其核心在于通过法律工具实现三重平衡&#xff1a; 债权债务的法律平衡&#xff1a;严格依据《民法典…

使用 Isaac Sim 模拟机器人

前言 将 2D 激光雷达数据从 Isaac Sim 流式传输至 ROS 2&#xff0c;并通过 RViz 进行可视化。通过激光雷达数据监控机器人与环境的交互&#xff0c;从而在仿真环境中提升机器人的感知能力。 概览 欢迎来到 入门指南&#xff1a;在 Isaac Sim 中模拟您的第一个机器人 课程。我…

quartz 表达式最近10次执行时间接口编写

Nuget安装 <PackageReference Include"CronExpressionDescriptor" Version"2.41.0" /> <PackageReference Include"CronExpressionDescriptor-zh-CN" Version"2.32.0" /> <PackageReference Include"Quartz"…

解锁数据宝藏:数据挖掘之数据预处理全解析

目录 一、引言&#xff1a;数据预处理 —— 数据挖掘的基石二、数据预处理的重要性2.1 现实数据的问题剖析2.2 数据预处理的关键作用 三、数据预处理的核心方法3.1 数据清洗3.1.1 缺失值处理3.1.2 离群点处理3.1.3 噪声处理 3.2 数据集成3.2.1 实体识别3.2.2 冗余处理3.2.3 数据…

React+Taro创建小程序

第一步&#xff1a;首先确认是否安装Node.js和npm 如果已安装Node.js和npm,以下可以查询 node -v npm -v 第二步&#xff1a;安装Taro CLI npm install -g tarojs/cli 第三步&#xff1a;创建项目 taro init my-react-taro-app 然后可以看到&#xff0c;下图 第四步&…

佳能Canon TS3100 Series打印机信息

打印功能 打印速度&#xff1a;黑白约 7.7 页 / 分钟&#xff0c;彩色约 4 页 / 分钟。打印分辨率&#xff1a;最高可达 48001200dpi&#xff0c;墨滴最小间距为 1/4800 英寸&#xff0c;能够保证高质量的输出&#xff0c;使文字清晰、色彩鲜艳。打印宽度&#xff1a;203.2 毫米…

家用电脑搭建可外网访问的网站服务器操作流程

在互联网时代&#xff0c;拥有一个属于自己的网站是展示个人风采、分享知识经验、开展线上业务的绝佳方式。你是否想过&#xff0c;利用家中闲置的电脑&#xff0c;就能搭建出一个可以被外网访问的网站服务器&#xff1f;这不仅能满足个性化需求&#xff0c;还能节省租用专业服…

CSS知识补充 --- 控制继承

每天学习一点点&#xff01;&#xff01;&#xff01; 总所周知&#xff0c;CSS某些属性可以继承&#xff0c;然后今天看到MDN的时候看到了CSS也可以控制继承&#xff0c;感觉很有意思&#xff0c;所以记录一下&#xff1a; 控制继承有5个属性值&#xff0c;分别&#xff1a;in…

如何使用Ant Design Blazor组件在列表页弹窗增加修改数据

在winform中首次使用net8做页面。列表页想使用Ant Design组件的弹窗组件实现。但第一次在winform项目中使用ant design组件&#xff0c;列表页面&#xff0c;点击新增&#xff0c;或者编辑操作实现弹窗页面&#xff0c;弹窗页面想使用模板页razor页来实现&#xff0c;而不是用m…

嵌入式学习 51单片机01

一、框架 1、CPU&#xff08;Central Processing Unit&#xff0c;中央处理单元&#xff09;‌是计算机的核心部件&#xff0c;负责执行计算机指令和处理数据。 2、MCU&#xff08;Microcontroller Unit&#xff0c;微控制单元&#xff09;‌是一种将中央处理器、内存、输入输出…