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.rhkb.cn/news/468289.html

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

相关文章

uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; ***环境问题移步至&#xff1a;uniapp—an…

清华大学提出Mini-Omni2:开源多模态模型,功能与GPT-4o媲美!

&#x1f310; 在人工智能领域&#xff0c;多模态模型的发展正如火如荼。今天&#xff0c;我们要介绍的是由清华大学提出的Mini-Omni2&#xff0c;这是一个开源的多模态语言模型&#xff0c;它在功能上与GPT-4o相媲美&#xff0c;能够理解和生成视觉、听觉和文本内容&#xff0…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class)&#xff0c;Go 语言的结构体(st…

ElasticSearch 添加IK分词器

ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装&#xff08;Winows 版本&#xff09;三、Ik分词器的下载安装&#xff08;Linux 版本&#xff09;四、验证测试&#xff08;postman工具&#xff09;测试 ik_smart 分词算法测试 ik_max_word 分词算法…

双指针算法的妙用:提高代码效率的秘密(2)

双指针算法的妙用&#xff1a;提高代码效率的秘密&#xff08;2&#xff09; 前言&#xff1a; 小编在前几日讲述了有关双指针算法两道题目的讲解&#xff0c;今天小编继续进行有关双指针算法习题的讲解&#xff0c;老规矩&#xff0c;今天还是两道题目的讲解&#xff0c;希望…

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip&#xff1a;浮动路由指在多条默认路由基础上加入优先级参数&#xff0c;实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数&#xff1a;越小越优 本次实验测试两条默认路由&#xff0c;其中一条默认路由添加优先级参数&#xff0c;设置…

利用VMware workstation pro 17安装 Centos7虚拟机以及修改网卡名称

通过百度网盘分享的文件&#xff1a;安装虚拟机必备软件 链接&#xff1a;https://pan.baidu.com/s/1rbYhDh8x1hTzlSNihm49EA?pwdomxy 提取码&#xff1a;omxy 123网盘 https://www.123865.com/s/eXPrVv-UsKch 提取码:eNcy 先自行安装好VMware workstation pro 17 设置虚拟机…

如何在Linux中使用Cron定时执行SQL任务

文章目录 前言一、方案分析二、使用步骤1.准备脚本2.crontab脚本执行 踩坑 前言 演示数据需要每天更新监控数据&#xff0c;不想手动执行&#xff0c;想到以下解决方案 navicat 创建定时任务java服务定时执行linux crontab 定时执行sql脚本 一、方案分析 我选择了第三个方案…

SpringBoot技术在企业资产管理中的应用

4系统概要设计 4.1概述 系统设计原则 以技术先进、系统实用、结构合理、产品主流、低成本、低维护量作为基本建设原则&#xff0c;规划系统的整体构架. 先进性&#xff1a; 在产品设计上&#xff0c;整个系统软硬件设备的设计符合高新技术的潮流&#xff0c;媒体数字化、压缩、…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

ArcGIS软件之“计算面积几何”地图制作

目录 一、消防站的泰森多边形ex12二、人口调查的泰森多边形三、人口调查的泰森多边形属性设置四、计算面积几何,用于求密度五、求密度六、给“现有中学”属性 R1赋值七、“现有中学”设置多环缓存区 并为它赋值八、“土地使用”为不同的功能区赋值九、三个图层相交十、计算面积…

一、有限状态机

一、状态基类 在创建一个FSM的有限状态机的缩写脚本 例&#xff1a;比如枚举这个状态&#xff0c;现在不确定是给敌人还是玩家&#xff0c;那么就写一个枚举的基类 在这里先创建了三个抽象方法&#xff0c;进行状态的切换&#xff1b; 并且这是一个状态基类&#xff0c;不需要…

C++20 概念与约束(2)—— 初识概念与约束

1、概念 C20 中引入新的编译期关键字 concept 用于创建概念。个人认为将其翻译为“构思”更为贴切。直接使用时&#xff0c;它更像一个只能用于模板的布尔类型关键字。 而如果用于模板中&#xff0c;他会将模板类型先带入自身&#xff0c;当自身条件为 true 才会实例化模板&…

程序员会被AI取代吗?

时间&#xff1a;2024年 11月 10日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;技术圈内关于“程序员会被AI取代…

2024 第五次周赛

A: 直接遍历即可 #include<bits/stdc.h> using namespace std;typedef long long ll; typedef pair<ll, ll>PII; const int N 2e6 10; const int MOD 998244353; const int INF 0X3F3F3F3F;int n, m; int main() {cin >> n;int cnt 0;for(int i 0; i …

十五、Linux线程(二)

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

stm32 ADC实例解析(3)-多通道采集互相干扰的问题

文章目录 一、问题现象&#xff1a;二、原因分析&#xff1a;1、测量值不准问题分析&#xff1a;2、采样干扰问题分析 三、解决办法&#xff1a;1、硬件&#xff1a;&#xff08;1&#xff09;、电源供电&#xff08;2&#xff09;、引脚电容&#xff08;3&#xff09;、减少采…

定制ShardingSphere-Proxy镜像满足业务需求

Sharding官方提供的proxy镜像是基础版的&#xff0c;如果我们使用Sharding有以下任意需求&#xff0c;就需要添加额外的依赖到容器{path}/ext-lib目录下。 向Docker容器中添加jar包的方式多种多样&#xff0c;推荐采取使用Dockerfile的方式添加依赖。将原有的镜像作为基础镜像&…

【数据分享】1901-2023年我国省市县镇四级的逐年降水数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月降水栅格数据和Shp和Excel格式的省市县四级逐月降水数据&#xff0c;原始的逐月降水栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月数据我们采用求年累计值的方法得到逐年降水栅格数据&#…

virtualBox部署minikube+istio

环境准备 virtualBox安装 直接官网下载后安装即可&#xff0c;网上也有详细教程。镜像使用的centos7。 链接&#xff08;不保证还可用&#xff09;&#xff1a;http://big.dxiazaicc.com/bigfile/100/virtualbox_v6.1.26_downcc.com.zip?auth_key1730185635-pWBtV8LynsxPD0-0-…