(1)DICOM简介

资源来自:JasonLiThirty B站up主,文档在:DICOM简述 - 简书 (jianshu.com)

  • DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义了质量能满足临床需要的可用于数据交换的医学图像格式。
  • https://www.dicomstandard.org/

目录

一.Dicom文件的主要结构

1.数据元素的组成规则

2.文件引言MetaInfo:标识一些常用信息,存储在0x0002Group里

3.数据集DataSet:医学图像的相关的信息 

4.UID的分类和三级层级关系

5.Dicom文件的解读步骤

二.Dicom标准定义的数据字典

1.标准数据字典(Stardard Data Dictionary)

2.私有数据字典(Private Data Dictionary)​编辑

3.标准命令字典(Standard Command Dictionary) 

4.数据字典格式

 三.VR定义表

四.Dicom编码方式(即传输语法)

1.VR隐式和显示编码

2.BIG/LITTLE Endian(大端模式/小端模式) 

3.分组长度编码

4.SQ Data Element的层数和编码规则


一.Dicom文件的主要结构

  • 主要包括文件头和像素数据两部分,像素数据就是图像数据,文件头包括文件引言(Meta Information)和数据集(Data set)。文件引言主要是存储常用的数据,数据集主要就是对整个数据的一个描述。两个变量都是由数据元素组成,数据元素分为两种SQ可嵌入的数据元素(一个数据元素还能再嵌套数据,但最多有三层)以及常规的数据元素。

1.数据元素的组成规则

  • Tag:信息的唯一性编码,两个十六进制的数的组合(Group, Element),group组
    * group的数值是偶数,代表是标准数据字典
    * group的数值是奇数,代表是自定义的私有数据字典
  • VR(Value Representations):DICOM定义得的数据类型
  • Value Length(数据长度):所有的数据元素都应该为偶数长度,若为奇数,需要加空格或空。
    * 奇数长度的字符串加空格
    * 奇数长度的数字加空NULL
  • Value Field:数据值,长度必须是偶数

2.文件引言MetaInfo:标识一些常用信息,存储在0x0002Group里

里面应该有以下的相关信息

3.数据集DataSet:医学图像的相关的信息 

例如:Patient:病人信息,键值为Patient ID(0010, 0020),那么里面可能就存储着

例如:Study:检查信息,键值为Study Instance UID(0020, 000D),那么里面可能就存储着

例如:Series:序列信息,键值为Series Instance UID(0020, 000E) ,那么里面可能就存储着

例如:Image:SOP影像信息,键值为SOP Instance UID(0008, 0018),那么里面可能就存储着扫描完之后得到的图片中有着那样的信息。

最终显示出来的可能为:

4.UID的分类和三级层级关系

一个患者可以做多次检查,每次检查都要产生序列,而一次序列可能产生多次图像。

UID的生成可自行写方法生成,也可使用第三库生成(DCMTK有相应的函数),最长64

enum UID_Type
{
    UID_Study = 1,
    UID_Series,
    UID_Image 
}

std::string GenerateUniqueId(UID_Type type)
{
    char uid[100];
    switch (type)
    {
    case UID_Study:
        dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
        break;
    case UID_Series:
        dcmGenerateUniqueIdentifier(uid, SITE_SERIES_UID_ROOT);
        break;
    case UID_Image:
        dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT);
        break;
    default:
        std::cout << "The type of unique id that is not supported! type :" << type << std::endl;
        break;
    }
    return std::string(uid);
}

5.Dicom文件的解读步骤

  1. 128个字节为00H,然后读取4个字节,值为“DICM”,确认是DICOM格式文件
  2. 其后就是meta info文件引言和data set数据集,根据Tag读取文件数据信息
  3. 直到(7fe0, 0010),存储图像数据的位置
  4. 读写一定要统一编码方式,否则同样的数据在不同的平台下会得出不同的结果

二.Dicom标准定义的数据字典

主要是三类:标准数据字典、私有数据字典、标准命令字典。

1.标准数据字典(Stardard Data Dictionary)

2.私有数据字典(Private Data Dictionary)

3.标准命令字典(Standard Command Dictionary) 

  • Group为0x0000,表示的都是操作命令,例如"打印","存储","Get请求"等
  • 例如(0x0000,0100)为command type,(0x0000,0110)为command message id

4.数据字典格式

  • Tag:属性标识,为两个十六进制的数的组合(0x0002, 0x0003),分别是Group和Element
    • Tag是按照Group和Element标签编号来排序的
  • Attribute:属性名称,和Tag是一一对应的
  • VR(Value Representation):数据类型,总共有27个值
  • VM(Value Multiplicity):规定了这个属性可以包含一个或多个数据值
    • 如果是二进制的多个值,直接拼接就好,可以根据字节数来获取
    • 如果是字符串的多个值,则用‘''来分隔

 三.VR定义表

27种DICOM的数据类型,大部分是字符串的数据类型。

四.Dicom编码方式(即传输语法)

编码方式有:VR隐式和显示、大端小端模式、分组长度编码

1.VR隐式和显示编码

  • VR隐式编码(implicit VR encoding):不知道数据是什么格式,少了VR,比较少用

  • VR显式编码(explicit VR encoding) 

VR = OB,OW,OF,SQ,UT,UN,VR固定2个字节,其后固定两个字节(0x0000) 

 VR != OB,OW,OF,SQ,UT,UN,VR固定2个字节,Value Length变成2个字节

2.BIG/LITTLE Endian(大端模式/小端模式) 

  • 大端模式(Big-Endian)就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
  • 小端模式(Little-Endian)就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  • 影响多字节类型数据的编码
    • 2-byte US, SS, OW,AT
    • 4-byte OF, UL, SL, FL
    • 8 byte FD
例如: 8-byte FD的数据6789ABCD, 
在小端little endian编码下是CDAB8967, 在大端BIG endian编码下是6789ABCD.
  • DCMTK下保存数据是可以使用枚举值来指定编码类型,查看DICOM就要看编码方式

3.分组长度编码

 group的第一个元素可以记录该group的总长度,但该属性值是不是必须要写的,一个组的第一个元素(gggg,0000)可以记录改组的总长度,因为每个元素的长度是偶数,所以这个总长度的值也是偶数。

好处:
* 如果不需要读某个Group时,可以直接根据字节数跳过;这样就可以加快DICOM文件的处理过程。它在处理奇数Group的数据时候尤其明显。因为奇数的Group数值自己不能读,可以很快地跳过。
* 它也可以作为校验数据长度。

坏处:
* 在写(gggg,0000)这个元素的时候,意味着这个group中的所有元素必须首先获取到,并且在(gggg,0000)之前已经编码好。对于DICOM开发者来说,这意味着两件事:

(1)所有的元素都必须编码完成,才能编码object
(2)修改了DICOM对象中一个元素时,就不可避免地修改了它的数值长度,就需要相应的修改它的值。这样就会带来额来的负担

4.SQ Data Element的层数和编码规则

 SQ Data Element最多3层,编码时要从下往上

1)SQ序列中的DICOM对象数据值以(FFFE, E000)开头,但数据长度可以不明确

①.DICOM对象数据值有明确的长度;如例1中的第一个和第二个数据对象;

②DICOM对象数据值没有明确的长度,标记为FFFFFFFF,需要使用(FFFE,E0DD)来识别结尾,这一项的值长度为0。

2)整个SQ序列数据长度也可以不明确 

①有明确的长度

②没有明确的长度,标记为FFFFFFFF,需要使用(FFFE,E0DD)来识别结尾,这一项的值长度为0

 

  • 19
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值