| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 【转】DICOM简述!!!! -> 正文阅读 |
|
[游戏开发]【转】DICOM简述!!!! |
转自:DICOM简述 - 简书 视频教程:https://www.bilibili.com/video/av66144772
一.Dicom文件的主要结构
? 1.数据元素的组成规则
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的分类和三级层级关系
5.Dicom文件的解读步骤
? 二.Dicom标准定义的数据字典1.标准数据字典(Stardard Data Dictionary)
|
VR | 含义 | 允许的字符 | 数据长 |
---|---|---|---|
**CS **- Code String 代码字符串 | 开头结尾可以有没有意义的空格的字符串,比如“CD123_4” | 大写字母,0-9,空格以及下划线字符 | 最多 16 个字符 |
SH - Short String 短字符串 | 短字符串,比如:电话号码,ID等 | 最多 16 个字符 | |
LO - Long String 长字符串 | 一个字符串,可能在开头、结尾填有空 格。比如“Introduction to DICOM” | 最多 64 个字符 | |
ST - Short Text 短文本 | 可能包含一个或多个段落的字符串 | 最多 1024 个字符 | |
LT - Long Text 短文本 | 可能包含一个或多个锻炼的字符串,与LO相同,但可以更长 | 最多 10240 个字符 | |
UT - Unlimited Text 无限制文本 | 包含一个或多个段落的字符串,与LT 类似 | 最多(2的32次方–2)个字符 | |
AE- Application Entity 应用实体 | 标识一个设备的名称的字符串,开头和 结尾可以有无意义的字符。比如“MyPC01” | 最多 16 个字符 | |
PN - Person Name 病人姓名 | 有插入符号()作为姓名分隔符的病人姓名。比如“SMITHJOHN” “Morrison- JonesSusan^^Ph.D, Chief Executive Officer” | 最多 64 个字符 | |
UI- Unique Identifier (UID) 唯一标识符 | 一个用作唯一标识各类项目的包含UID 的字符串。比如“1.2.840.10008.1.1” | 0-9 和半角句号(.) | 最多64 个字符 |
DA - Date 日期 | 格式为 YYYYMMDD 的字符串;YYYY 代表年;MM 代表月;DD 代表日。比 如“20050822”表示2005 年 8 月 22 日 | 0-9 | 8个字符 |
TM - Time 时间 | 格式为 HHMMSS 的字符串。FRAC; HH 表示小时(范围“00”-“23”); MM 表示分钟(范围“00”-“59”); 而 FRAC 包含秒的小数部分,即百万分 之一秒。比如“183200.00” 表示下午 6:32 就是微秒(microsecond) | 0-9 和半角句号(.) | 最多 16 个字符 |
DT - Date Time 日期时间 | 格式为 YYYYMMDDHHMMSS. FFFFFF,串联的日期时间字符串。字符串的各部分从左至右是:年YYYY;月 MM;日 DD;小时HH;分钟 MM;秒 SS;秒的小数FFFFFF。比如20050812183000.00”表示 2005年 8 月 12 日下午 18 点 30 分 00秒 | 0-9,加号,减号和半角句号 | 最多 26 个字符 |
AS - Age String 年龄字符串 | 符合以下格式的字符串:nnnD,nnnW, nnnM, nnnY;其中nnn 对于 D 来说表示天数,对于W来说表示周数,对于M 来说表示月数,对于 Y 来说表示岁数。 比如“018M”表示他的年龄是 18 个月 | 0–9, D,W,M, Y | 4 个字符 |
IS- Integer String 整型字符串 | 表示一个整型数字的字符串。比如“-1234567” | 0-9,加号(+),减号(-) | 最多 12 个字符 |
DS - Decimal String 小数字符串 | 表示定点小数和浮点小数。 比如“12345.67”,“-5.0e3” | 0-9,加号(+),减号(-), 最多 16个字符 E,e和半角句号(.) | 最多 16 个字符 |
SS - Signed Short 有符号短型 | 符号型二进制整数,长度 16 比特 | 2 个字符 | |
US - Unsigned Short 无符号短型 | 无符号二进制整数,长度 16 比特 | 2 个字符 | |
SL - Signed Long 有符号长型 | 有符号二进制整数 | 4 个字符 | |
UL - Unsigned Long 无符号长型 | 无符号二进制整数,长度 32 比特 | 4 个字符 | |
AT - Attribute Tag 属性标签 | 16 比特无符号整数的有序对,数据元素的标签 | 4 个字符 | |
FL - Floating Single 单精度浮点 | 单精度二进制浮点数字 | 4 个字符 | |
FD - Floating Point Double 双精度二进制浮点数字 | 双精度二进制浮点数字 | 8 个字符 | |
OB - Other Byte String 其他字节字符串 | 字节的字符串(“其他”表示没有在VR中定义的内容) | ||
OW- Other Word String 其他单词字符串 | 16 比特(2 字节)单词字符串 | ||
OF- Other Float String 其他浮点字符串 | 32 比特(4 个字节)浮点单词字符串 | ||
SQ - Sequence Items 条目序列 | 条目的序列 | ||
UN – Unknown 未知 | 字节的字符串,其中内容的编码方式是未知的 |
?
?
?
?
VR != OB,OW,OF,SQ,UT,UN,VR固定2个字节,Value Length变成2个字节
?
?
例如: 8-byte FD的数据6789ABCD,
在little endian编码下是CDAB8967, 在BIG endian编码下是6789ABCD.
OFCondition status = m_fileformat.saveFile(filePath.c_str(), EXS_LittleEndianExplicit);
if (!status.good())
{
std::cout << "Save Dimcom File Error!" << std::endl;
}
/** enumeration of all DICOM transfer syntaxes known to the toolkit
*/
typedef enum {
/// unknown transfer syntax or dataset created in-memory
EXS_Unknown = -1,
/// Implicit VR Little Endian
EXS_LittleEndianImplicit = 0,
/// Implicit VR Big Endian (pseudo transfer syntax that does not really exist)
EXS_BigEndianImplicit = 1,
/// Explicit VR Little Endian
EXS_LittleEndianExplicit = 2,
/// Explicit VR Big Endian
EXS_BigEndianExplicit = 3,
/// JPEG Baseline (lossy)
EXS_JPEGProcess1 = 4,
/// JPEG Extended Sequential (lossy, 8/12 bit)
EXS_JPEGProcess2_4 = 5,
/// JPEG Extended Sequential (lossy, 8/12 bit), arithmetic coding
EXS_JPEGProcess3_5 = 6,
/// JPEG Spectral Selection, Non-Hierarchical (lossy, 8/12 bit)
EXS_JPEGProcess6_8 = 7,
/// JPEG Spectral Selection, Non-Hierarchical (lossy, 8/12 bit), arithmetic coding
EXS_JPEGProcess7_9 = 8,
/// JPEG Full Progression, Non-Hierarchical (lossy, 8/12 bit)
EXS_JPEGProcess10_12 = 9,
/// JPEG Full Progression, Non-Hierarchical (lossy, 8/12 bit), arithmetic coding
EXS_JPEGProcess11_13 = 10,
/// JPEG Lossless with any selection value
EXS_JPEGProcess14 = 11,
/// JPEG Lossless with any selection value, arithmetic coding
EXS_JPEGProcess15 = 12,
/// JPEG Extended Sequential, Hierarchical (lossy, 8/12 bit)
EXS_JPEGProcess16_18 = 13,
/// JPEG Extended Sequential, Hierarchical (lossy, 8/12 bit), arithmetic coding
EXS_JPEGProcess17_19 = 14,
/// JPEG Spectral Selection, Hierarchical (lossy, 8/12 bit)
EXS_JPEGProcess20_22 = 15,
/// JPEG Spectral Selection, Hierarchical (lossy, 8/12 bit), arithmetic coding
EXS_JPEGProcess21_23 = 16,
/// JPEG Full Progression, Hierarchical (lossy, 8/12 bit)
EXS_JPEGProcess24_26 = 17,
/// JPEG Full Progression, Hierarchical (lossy, 8/12 bit), arithmetic coding
EXS_JPEGProcess25_27 = 18,
/// JPEG Lossless, Hierarchical
EXS_JPEGProcess28 = 19,
/// JPEG Lossless, Hierarchical, arithmetic coding
EXS_JPEGProcess29 = 20,
/// JPEG Lossless, Selection Value 1
EXS_JPEGProcess14SV1 = 21,
/// Run Length Encoding (lossless)
EXS_RLELossless = 22,
/// Deflated Explicit VR Little Endian
EXS_DeflatedLittleEndianExplicit = 23,
/// JPEG-LS (lossless)
EXS_JPEGLSLossless = 24,
/// JPEG-LS (lossless or near-lossless mode)
EXS_JPEGLSLossy = 25,
/// JPEG 2000 (lossless)
EXS_JPEG2000LosslessOnly = 26,
/// JPEG 2000 (lossless or lossy)
EXS_JPEG2000 = 27,
/// JPEG 2000 part 2 multi-component extensions (lossless)
EXS_JPEG2000MulticomponentLosslessOnly = 28,
/// JPEG 2000 part 2 multi-component extensions (lossless or lossy)
EXS_JPEG2000Multicomponent = 29,
/// JPIP Referenced
EXS_JPIPReferenced = 30,
/// JPIP Referenced Deflate
EXS_JPIPReferencedDeflate = 31,
/// MPEG2 Main Profile at Main Level
EXS_MPEG2MainProfileAtMainLevel = 32,
/// MPEG2 Main Profile at High Level
EXS_MPEG2MainProfileAtHighLevel = 33,
/// MPEG4 High Profile / Level 4.1
EXS_MPEG4HighProfileLevel4_1 = 34,
/// MPEG4 BD-compatible High Profile / Level 4.1
EXS_MPEG4BDcompatibleHighProfileLevel4_1 = 35,
/// MPEG4 High Profile / Level 4.2 For 2D Video
EXS_MPEG4HighProfileLevel4_2_For2DVideo = 36,
/// MPEG4 High Profile / Level 4.2 For 3D Video
EXS_MPEG4HighProfileLevel4_2_For3DVideo = 37,
/// MPEG4 Stereo High Profile / Level 4.2
EXS_MPEG4StereoHighProfileLevel4_2 = 38,
/// HEVC/H.265 Main Profile / Level 5.1
EXS_HEVCMainProfileLevel5_1 = 39,
/// HEVC/H.265 Main 10 Profile / Level 5.1
EXS_HEVCMain10ProfileLevel5_1 = 40,
/// Private GE Little Endian Implicit with big endian pixel data
EXS_PrivateGE_LEI_WithBigEndianPixelData = 41
} E_TransferSyntax;
group的第一个元素可以记录该group的总长度,但该属性值是不是必须要写的,一个组的第一个元素(gggg,0000)可以记录改组的总长度,因为每个元素的长度是偶数,所以这个总长度的值也是偶数
?
好处:
* 如果不需要读某个Group时,可以直接根据字节数跳过;这样就可以加快DICOM文件的处理过程。它在处理奇数Group的数据时候尤其明显。因为奇数的Group数值自己不能读,可以很快地跳过。
* 它也可以作为校验数据长度。
坏处:
* 在写(gggg,0000)这个元素的时候,意味着这个group中的所有元素必须首先获取到,并且在(gggg,0000)之前已经编码好。对于DICOM开发者来说,这意味着两件事:
(1)所有的元素都必须编码完成,才能编码object
(2)修改了DICOM对象中一个元素时,就不可避免地修改了它的数值长度,就需要相应的修改它的值。这样就会带来额来的负担。
?
?
SQ序列中的DICOM对象数据值以(FFFE,?E000)开头,但数据长度可以不明确
1.DICOM对象数据值有明确的长度;如例1中的第一个和第二个数据对象;
?
?
整个SQ序列数据长度也可以不明确
1.有明确的长度
?
2.没有明确的长度,标记为FFFFFFFF,需要使用(FFFE,E0DD)来识别结尾,这一项的值长度为0
作者:JasonLiThirty
链接:https://www.jianshu.com/p/758fa8c22474
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/29 12:09:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |