首页 > 其他分享 >DICOM图像知识:DICOM图像排序与坐标系解析

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

时间:2024-11-10 10:49:13浏览次数:3  
标签:Patient DICOM Image 图像 Series Study 排序 坐标系

目录

引言

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的坐标系和元数据,将有助于更好地解析和应用影像数据。

标签:Patient,DICOM,Image,图像,Series,Study,排序,坐标系
From: https://blog.csdn.net/martian665/article/details/143486519

相关文章

  • halcon中将xld轮廓或者region区域绘制在图像上并保存
    1)单通道图像的绘制draw_circle(WindowHandle,Row,Column,Radius)gen_circle(Circle,Row,Column,Radius)paint_region(Circle,Image,ImageR,0,'fill')paint_region(Circle,Image,ImageG,255,'fill')paint_region(Circle,Image,ImageB,......
  • 医学图像分割综述(肝脏等器官与肿瘤的分割)——组会必备
    制作了一个思维脑图,下面的MakeDown格式的,脑图会截图发在下面,也可以找我要源文件。医学图像分割综述参考论文MedicalImageSegmentationUsingDeepLearning:ASurveySubmittedon28Sep2020(v1),lastrevised22Dec2021(thisversion,v3)]对基于深度学习......
  • 万字长文深度解读Movie Gen技术原理(5部曲):图像&视频联合生成模型 (2)
    ​引言简介图像和视频基础模型时间自编码器(TAE)训练目标骨干架构文本嵌入和视觉-文本生成空间上采样模型扩展和训练效率预训练预训练数据训练微调STF微调数据集创建监督微调&模型平均推理推理提示重写提高推理效率评估评估维度评估......
  • 坐标系相关知识科普
    四/七参数计算方法及"傻瓜式"转换流程坐标转换隶属于"大地测量学"的范畴,而大地测量学呢,又是整个测绘学科中最基础、最重要,但知识的理论性最强的一门学科。今天呢,测绘营地将尽量用通俗易懂的语言为大家讲解一下坐标系的区别、几种转换方式、中央子午线的确定等等基本科普知识,然后......
  • 【PS2024】Adobe Photoshop专业图像处理软件下载
    一、软件简介1.什么是AdobePhotoshop?AdobePhotoshop,简称PS,是Adobe公司开发的一款专业图像处理软件。自1988年推出以来,Photoshop凭借其强大的功能、灵活的操作性和广泛的适用性,成为全球最为流行和高效的图像编辑工具之一。Photoshop主要用于图像修整、数字绘画、合成与设计......
  • YOLOv8目标检测、跟踪、图像分割和姿态估计应用程序+Streamlit制作的用户界面
    YOLOv8多功能应用开发指南在当今的计算机视觉领域,YOLO(YouOnlyLookOnce)系列模型以其快速而准确的目标检测能力闻名。随着技术的进步,YOLOv8不仅继承了前代模型的优点,还进一步增强了性能,并引入了新的功能如目标跟踪、图像分割及姿态估计。本篇将详细介绍如何基于YOLOv8构......
  • 图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单
    图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数(毕设+代码)车牌识别用python3+opencv3做的中国车牌识别,包括算法和客户端界面,只有2个文件,一个是界面代码,一个是算法代码,点击即可出结果,方便易用!链接:车牌识别......
  • 在PHP中删除图像的背景颜色
    在PHP中,删除图像的背景颜色可以使用图像处理库如GD或Imagick来实现。以下是使用GD库删除图像背景颜色的示例代码:<?php//设置要处理的图像文件路径$sourceImagePath='/home/wwwroot/web_e/public/logo.png';//创建一个新的图像资源$sourceImage=imagecreatefrompng($source......
  • JavaCV 图像边缘检测 之 Canny 算法
    ......
  • LeetCode100之旋转图像(48)--Java
    1.问题描述  给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转90度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。        示例1输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]......