DICOM图像知识:DICOM图像排序与坐标系解析

目录

引言

1. 概述

2. DICOM图像排序规则

2.1 Patient的Study按Study Date排序

2.2 Study的Series按Series Number排序

2.3 Series的SOP按Instance Number或Slice Location排序

2.3.1 Instance Number排序

2.3.2 Slice Location排序

2.3.3 使用Image Position (Patient)和Image Orientation (Patient)

3. DICOM坐标系与相关元数据

3.1 DICOM坐标系概述

3.2 Image Position (Patient)和Image Orientation (Patient)

3.2.1 Image Position (Patient)

3.2.2 Image Orientation (Patient)

4. 实际应用与示例

4.1 示例排序流程

4.2 C++实现示例

注意事项

5. 总结


引言

医学影像在临床诊断和研究中发挥着至关重要的作用,而DICOM(数字成像和通信医学)标准是目前存储和传输医学影像的主要方式。在DICOM中,图像的排序对于正确理解和分析患者的影像数据至关重要。本文将详细探讨DICOM图像的排序规则,以及相关的坐标系和元数据的含义。

1. 概述

DICOM标准用于存储和传输医学影像数据,并包含复杂的层次结构。影像数据通常以Patient、Study、Series和SOP(Service-Object Pair)四级结构组织。为了正确地展示和分析这些影像数据,我们需要遵循特定的排序规则。

2. DICOM图像排序规则

2.1 Patient的Study按Study Date排序

在DICOM中,每个Patient(患者)可以有多个Study(研究/检查)。为了理清时间顺序,通常按Study Date(0020,0008)对这些Study进行排序:

  • Study Date:表示Study的日期,格式为YYYYMMDD。
  • 排序方法:按时间顺序从早到晚排列。

这种排序方式有助于医疗人员查看患者的病史和随访过程。

2.2 Study的Series按Series Number排序

每个Study通常包含多个Series(序列),每个Series可以代表不同的成像技术或参数设置。Series按Series Number(0020,0011)排序:

  • Series Number:一个整数,标识同一Study下的不同Series。
  • 排序方法:按Series Number的数值升序排列。

Series Number可以帮助区分同一Study下的不同影像序列,如不同的MRI序列或不同的CT扫描相位。

2.3 Series的SOP按Instance Number或Slice Location排序

在每个Series中,有多个SOP实例,通常对应一系列切片图像。常用的排序依据有:

2.3.1 Instance Number排序
  • Instance Number (0020,0013):表示影像在Series中的顺序,通常用于初步排序。
  • 排序方法:按Instance Number的数值升序排列。
2.3.2 Slice Location排序
  • Slice Location (0020,1041):表示切片在病人体内的位置,通常用于更精确的排序。
  • 排序方法:按Slice Location数值升序排列。
2.3.3 使用Image Position (Patient)和Image Orientation (Patient)

当Instance Number和Slice Location不足以反映切片的正确顺序时,可以使用Image Position (Patient)和Image Orientation (Patient)进行排序:

  • Image Position (Patient) (0020,0032):表示图像左上角像素在患者体坐标系中的位置,通常为三个坐标值 (x, y, z)。
  • Image Orientation (Patient) (0020,0037):表示图像行和列的方向向量,通常为六个值,前三个表示行方向,后三个表示列方向。

排序方法:

  1. 根据Image Orientation确定主要的切片方向(轴向、矢状或冠状)。
  2. 在主要方向上,使用Image Position的值进行排序。

3. DICOM坐标系与相关元数据

3.1 DICOM坐标系概述

DICOM坐标系基于患者体坐标系,通常定义如下:

  • X轴:从患者左侧到右侧,左为负,右为正。
  • Y轴:从患者背部到腹部,背为负,腹为正。
  • Z轴:从患者脚到头,脚为负,头为正。

这种坐标系有助于标准化不同设备和厂家生成的影像数据。

3.2 Image Position (Patient)和Image Orientation (Patient)

3.2.1 Image Position (Patient)
  • 含义:图像左上角像素在患者体坐标系中的三维位置。
  • 用途:用于确定图像在三维空间中的绝对位置,特别是在多切片排序和重建中。
3.2.2 Image Orientation (Patient)
  • 含义:描述图像行和列在患者体坐标系中的方向。
  • 用途:用于确定图像的拍摄角度和方向,确保不同扫描间的对齐。

Image Orientation提供了两个向量,分别表示图像的行和列方向。例如,[1, 0, 0, 0, 1, 0]表示标准轴向切片,其行方向为X轴正方向,列方向为Y轴正方向。

4. 实际应用与示例

4.1 示例排序流程

假设我们有一个患者的DICOM影像数据集,包含不同的Study、Series和SOP。排序流程如下:

  1. 按Study Date排序Study:将所有Study按日期升序排列。
  2. 按Series Number排序Series:在每个Study中,对其包含的Series按Series Number排序。
  3. 按Image Position (Patient)排序SOP:在每个Series中,根据Image Orientation判断主要方向,并使用Image Position进行排序。

4.2 C++实现示例

下面是一个简单的C++示例,使用DCMTK库对DICOM文件进行排序:

#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/dcmimgle/dcmimage.h>
#include <iostream>
#include <vector>
#include <algorithm>// 定义一个结构体来存储DICOM信息
struct DicomInfo {DcmDataset* dataset;std::string studyDate;int seriesNumber;float imagePosition[3];
};// 比较函数:用于按Study Date排序
bool compareByStudyDate(const DicomInfo& a, const DicomInfo& b) {return a.studyDate < b.studyDate;
}// 比较函数:用于按Series Number排序
bool compareBySeriesNumber(const DicomInfo& a, const DicomInfo& b) {return a.seriesNumber < b.seriesNumber;
}// 比较函数:用于按Image Position排序(假设Z轴为主要方向)
bool compareByImagePosition(const DicomInfo& a, const DicomInfo& b) {return a.imagePosition[2] < b.imagePosition[2];
}int main() {const char* dicomDirectory = "path/to/dicom/files";std::vector<DicomInfo> dicomFiles;// 遍历目录并读取DICOM文件DcmFileFormat fileFormat;DcmDirInterface dicomDir(dicomDirectory);if (dicomDir -> isGood()) {const DcmDirectoryRecord* record = dicomDir -> getFirstRecord();while (record != NULL) {OFString fileName;if (record -> findAndGetOFString(DCM_ReferencedFileID, fileName).good()) {if (fileFormat.loadFile(fileName.c_str()).good()) {DcmDataset* dataset = fileFormat.getDataset();DicomInfo info;dataset -> findAndGetOFString(DCM_StudyDate, info.studyDate);dataset -> findAndGetSint32(DCM_SeriesNumber, info.seriesNumber);dataset -> findAndGetFloat32Array(DCM_ImagePositionPatient, info.imagePosition);info.dataset = dataset;dicomFiles.push_back(info);}}record = dicomDir -> getNextRecord();}}// 排序std::sort(dicomFiles.begin(), dicomFiles.end(), compareByStudyDate);std::sort(dicomFiles.begin(), dicomFiles.end(), compareBySeriesNumber);std::sort(dicomFiles.begin(), dicomFiles.end(), compareByImagePosition);// 输出排序结果for (const auto& dicom : dicomFiles) {std::cout << "Study Date: " << dicom.studyDate<< ", Series Number: " << dicom.seriesNumber<< ", Image Position: (" << dicom.imagePosition[0] << ", "<< dicom.imagePosition[1] << ", " << dicom.imagePosition[2] << ")" << std::endl;}return 0;
}

注意事项

  • DCMTK库提供了强大的DICOM文件操作能力,但使用时需注意DICOM数据的完整性和有效性。
  • 在使用DCMTK库时,请确保安装并配置库路径,以便编译和链接正确。

5. 总结

        DICOM图像的排序是医学影像分析中的基础步骤,确保了影像的连贯性和准确性。通过理解和应用DICOM的相关元数据,尤其是坐标系信息,可以有效地对影像进行排序和定位。这种排序不仅适用于临床诊断中的影像查看,也为后续的三维重建和影像分析打下坚实基础。理解DICOM的坐标系和元数据,将有助于更好地解析和应用影像数据。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

B-Spline(B样条)插值

B-Spline&#xff08;B样条&#xff09;详细介绍 B-Spline&#xff08;B样条&#xff09;是一种常用于计算机图形学和数据拟合的数学方法。它由一系列控制点和节点&#xff08;Knots&#xff09;以及一组基函数&#xff08;Basis Functions&#xff09;组成。B-Spline 能够通过…

HarmonyOS Next 并发 taskpool 和 worker

HarmonyOS Next 并发 taskpool 和 worker 总览 介绍 并发&#xff0c;指的是同一时间内&#xff0c;多段代码同时执行。在ArkTs编程中&#xff0c;并发分为异步并发和多线程并发。 异步并发 异步并发并不是真正的并发&#xff0c;比如在单核设备中&#xff0c;同时执行多端…

4.3软件设计:面对对象的设计

面对对象设计 1、面对对象的架构设计1.1 第一步&#xff1a;构造系统的物理模型1.2 第二步&#xff1a;设计子系统划分各个子系统的方式定义子系统之间的关系定义子系统的接口 1.3 第三步&#xff1a;非功能需求设计 2、面对对象的用例设计与类设计2.1 类2.2 类间关系2.3 细化用…

华为OD机试 - 求小球落地5次后所经历的路程和第5次反弹的高度 (Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 实战项目访问&#xff1a;http://javapub.net.cn/ 专栏导读 本专栏收录于 《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》 。 刷的越多&#xff0c;抽中的概率越大&…

VBA08-if语句

一、单行 If 语句 If x > 10 Then MsgBox "x is greater than 10"二、多行 If...Then...End If 语句 If x > 10 ThenMsgBox "x is greater than 10"y x 5 End If 三、If...Then...Else 语句 If condition Then 当条件为真时执行的代码块stateme…

JS 函数的基本知识

目录 1. 介绍函数 2. 使用函数 3. 函数传参 3.1 传递默认值 3.2 传递数组 3.3 传递变量 4. 函数返回值 5. 匿名函数 6. 立即执行函数 7. 注意 1. 介绍函数 在学习 CSS 样式过程中&#xff0c;经常有如下操作&#xff1a; 2. 使用函数 函数声明&#xff1a; 函数命名规…

澳鹏通过高质量数据支持 Onfido 优化AI反欺诈功能

“Appen 在 Onfido 的发展中发挥了至关重要的作用&#xff0c;并已成为我们运营的重要组成部分。我们很高兴在 Appen 找到了可靠的合作伙伴。” – Onfido 数据和分析总监 Francois Jehl 简介&#xff1a;利用人工智能和机器学习增强欺诈检测 在当今日益数字化的世界&#xff…

【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解

目录 一、前言 二、Spring AI概述 2.1 spring ai是什么 2.2 Spring AI 核心能力 2.3 Spring AI 应用场景 三、Spring AI Alibaba 介绍 3.1 Spring AI Alibaba 是什么 3.2 Spring AI Alibaba 核心特点 3.3 Spring AI Alibaba 应用场景 四、SpringBoot 对接Spring AI Al…

小白学习之路:咖啡叶锈病分割

咖啡叶锈病分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-Faster-EMA&#xff06;yolov8-seg-SPPF-LSKA等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Globa…

RabbitMQ设置TTL(消息过期)时间(重要)

RabbitMQ设置消息过期时间 1、过期消息&#xff08;死信&#xff09;2、设置消息过期的两种方式2.1、设置单条消息的过期时间2.1.1、配置文件application.yml2.1.2、配置类RabbitConfig2.1.3、发送消息业务类service&#xff08;核心代码&#xff09;2.1.4、启动类2.1.5、依赖文…

让你的网站与众不同:6款独特播放器设计

文章目录 前言正文1.可拖动播放列表2.强调无障碍设计3.材质设计风格音频播放器4.旋转的黑胶唱片设计5.流畅且响应迅速6.带悬停标签的控制按钮 总结 前言 随着HTML5的普及&#xff0c;网站轻松添加音视频内容变得简单&#xff0c;但默认播放器功能有限&#xff0c;无法满足个性…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

AI, Machine Learning, Deep Learning 和 Generative AI

人工智能的采用开始得相当缓慢&#xff0c;大多数人甚至不知道它的存在&#xff0c;即使知道&#xff0c;也似乎还需要 5 到 10 年的时间&#xff0c;但后来机器学习、深度学习等东西出现了&#xff0c;我们开始看到一些应用&#xff0c;然后基础模型出现了。 AI 人工智能&am…

C# 一个工具类让winform自动根据窗体大小自适应缩放所有控件

AutoControlSize.cs工具类&#xff0c;功能是使控件尺寸随着主对话框尺寸按比例调整。并且使用方式十分简单&#xff0c;只需要调用两个函数即可实现整个页面的控件根据窗体的大小改变而跟着缩放。 1、使用效果如下&#xff1a; 未缩放前的原始窗体页面 缩放后的窗体页面&…

用 Python 从零开始创建神经网络(二):第一个神经元的进阶

第一个神经元的进阶 引言1. Tensors, Arrays and Vectors&#xff1a;2. Dot Product and Vector Additiona. Dot Product &#xff08;点积&#xff09;b. Vector Addition &#xff08;向量加法&#xff09; 3. A Single Neuron with NumPy4. A Layer of Neurons with NumPy5…

VS2022项目配置笔记

文章目录 $(ProjectDir&#xff09;与 $(SolutionDir) 宏附加包含目录VC目录和C/C的区别 $(ProjectDir&#xff09;与 $(SolutionDir) 宏 假设有一个解决方案 MySolution&#xff0c;其中包含两个项目 ProjectA 和 ProjectB&#xff0c;目录结构如下&#xff1a; C:\Projects\…

十五、Linux线程(二)

4.线程的分离属性 通过属性设置线程的分离 1.线程属性类型&#xff1a; pthread_attr_t attr; 2.线程属性操作函数&#xff1a; &#xff08;1&#xff09;对线程属性变量的初始化 int pthread_attr_init(pthread_attr_t* attr); &#xff08;2&#xff09;设置线程分离属…

Unity学习笔记(1):素材导入

文章目录 前言学习目标开发环境资源文件下载Unity窗口设置修改导入像素素材设置可以直接拖动导入设置像素图片格式导入多合一素材设置切割 总结 前言 最近由于工作的事情&#xff0c;很糟心。最近非常的迷茫。 学习目标 根据我的加的几个QQ群了解到&#xff0c;国内游戏行业…

简历模板(艺术风)

每份简历模板都有四页 36款艺术风简历模板 一、水墨古风 二、唯美淡雅 三、时尚个性 四、艺术气质