当前位置: 首页 > news >正文

fo-dicom开发之DICOM数据解析:常见数据类型及处理方法详解

前言

前面的文章,我们介绍了fo-dicom是一个怎样的开源库:fo-dicom,第一个基于.NET Standard 2.0 开发的DICOM开源库,以及 学会使用fo-dicom前,了解其非常重要的基本概念,本次我们将了解,当进行DICOM数据解析时,对不同的数据类型的认知,这一点也非常重要。所以我们提前了解,在真实的解析过程中,避免解析异常的bug。
在这里插入图片描述

每个DicomTag对应一个数据类型。
在这里插入图片描述

接下来详细介绍每种数据类型:

在这里插入图片描述

1. 字符串类型

1 VR: AE

  • 含义:Application Entity(应用实体)
  • 允许字符:ASCII码字符集中的空格和0-9、A-Z、a-z、可选字符“\”、“^”、“_”。
  • 数据长度:<= 16个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string applicationEntityTitle = dataset.GetString(DicomTag.RetrieveAETitle);

2 VR: AS

  • 含义:Age String(年龄字符串)
  • 允许字符:ASCII码字符集中的0-9和字母Y(代表年龄)。
  • 数据长度:4个字符,例如"012Y"表示12岁。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");DicomAgeString age = dataset.GetValue<DicomAgeString>(DicomTag.PatientAge);
string ageString = age.ToString();

3 VR: AT

  • 含义:Attribute Tag(属性标签)
  • 允许字符:16进制数,例如"(0028,0010)"。
  • 数据长度:4个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");DicomTag pixelDataTag = dataset.Get<DicomTag>(DicomTag.PixelData);
int groupNumber = pixelDataTag.Group;
int elementNumber = pixelDataTag.Element;

4 VR: CS

  • 含义:Code String(代码字符串)
  • 允许字符:ASCII码字符集中的空格和0-9、A-Z、a-z。
  • 数据长度:<= 16个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string modality = dataset.GetString(DicomTag.Modality);

5 VR: DS

  • 含义:Decimal String(十进制字符串)
  • 允许字符:ASCII码字符集中的数字、正负号和小数点,例如"-123.45"。
  • 数据长度:<= 16个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");double pixelSpacingX = dataset.GetDouble(DicomTag.PixelSpacingX);

6 VR: LO

  • 含义:Long String(长字符串)
  • 允许字符:ASCII码字符集中的任何字符。
  • 数据长度:<= 64个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string patientName = dataset.GetString(DicomTag.PatientName);

7 VR: LT

  • 含义:Long Text(长文本)
  • 允许字符:ASCII码字符集中的任何字符。
  • 数据长度:<= 10240个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string studyDescription = dataset.GetString(DicomTag.StudyDescription);

8 VR: PN

  • 含义:Person Name(人名)
  • 允许字符:ASCII码字符集中的空格、0-9、A-Z、a-z、可选字符“^”、“=”。
  • 数据长度:<= 64个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");DicomPersonName patientName = dataset.GetValue<DicomPersonName>(DicomTag.PatientName);
string fullName = patientName.ToString();

9 VR: SH

  • 含义:Short String(短字符串)
  • 允许字符:ASCII码字符集中的任何字符。
  • 数据长度:<= 16个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string studyID = dataset.GetString(DicomTag.StudyID);

10 VR: ST

  • 含义:Short Text(短文本)
  • 允许字符:ASCII码字符集中的任何字符。
  • 数据长度:<= 1024个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string studyComments = dataset.GetString(DicomTag.StudyComments);

2.日期类型

11 VR: DT

  • 含义:Date Time(日期时间)
  • 允许字符:ASCII码字符集中的数字、空格、冒号和“-”号,例如"2022-01-01 12:00:00"。
  • 数据长度:<= 26个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");DateTime acquisitionDateTime = dataset.GetDateTime(DicomTag.AcquisitionDateTime);

12 VR: DA

  • 含义:Date(日期)
  • 允许字符:ASCII码字符集中的数字和“-”号,例如"2022-01-01"。
  • 数据长度:8个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");DateTime studyDate = dataset.GetDateTime(DicomTag.StudyDate);

13 VR: TM

  • 含义:Time(时间)
  • 允许字符:ASCII码字符集中的数字和冒号,例如"12:00:00"。
  • 数据长度:<= 14个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");DateTime studyTime = dataset.GetDateTime(DicomTag.StudyTime);

14 VR: UT

  • 含义:Unlimited Text(无限制文本)
  • 允许字符:ASCII码字符集中的任何字符。
  • 数据长度:无限制。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string fullText = dataset.GetString(DicomTag.TextValue);

3.标识符类型

15 VR: UI

  • 含义:Unique Identifier(唯一标识符)
  • 允许字符:ASCII码字符集中的数字、字母和“.”、“:”、“-”等字符,例如"1.2.840.10008.5.1.4.1.1.7"。
  • 数据长度:<= 64个字符。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");string sopClassUID = dataset.GetString(DicomTag.SOPClassUID);

4. 数值类型

16 VR: SS

  • 含义:Signed Short(带符号短整型)
  • 允许字符:带符号16位二进制补码整数。
  • 数据长度:2个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");short rows = dataset.Get<short>(DicomTag.Rows);

17 VR: US

  • 含义:Unsigned Short(无符号短整型)
  • 允许字符:无符号16位二进制整数。
  • 数据长度:2个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");ushort columns = dataset.Get<ushort>(DicomTag.Columns);

18 VR: SL

  • 含义:Signed Long(带符号长整型)
  • 允许字符:带符号32位二进制补码整数。
  • 数据长度:4个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");int numberOfFrames = dataset.Get<int>(DicomTag.NumberOfFrames);

19 VR: UL

  • 含义:Unsigned Long(无符号长整型)
  • 允许字符:无符号32位二进制整数。
  • 数据长度:4个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");uint frameIncrementPointer = dataset.Get<uint>(DicomTag.FrameIncrementPointer);

20 VR: FL

  • 含义:Floating Point Single(单精度浮点数)
  • 允许字符:32位IEEE浮点数。
  • 数据长度:4个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");float rescaleSlope = dataset.Get<float>(DicomTag.RescaleSlope);

21 VR: FD

  • 含义:Floating Point Double(双精度浮点数)
  • 允许字符:64位IEEE浮点数。
  • 数据长度:8个字节。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");double rescaleIntercept = dataset.Get<double>(DicomTag.RescaleIntercept);

22 VR: IS

  • 含义:Integer String(整数字符串)
  • 允许字符:一系列表示整数的ASCII字符。
  • 数据长度:取决于实际字符串长度。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");int frameNumber = dataset.Get<int>(DicomTag.FrameNumber);

23 VR: OD

  • 含义:Other Double(其他双精度浮点数)
  • 允许字符:一系列二进制数据。
  • 数据长度:取决于实际数据长度。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");double[] pixelData = dataset.Get<double[]>(DicomTag.PixelData);

24 VR: OF

  • 含义:Other Float(其他单精度浮点数)
  • 允许字符:一系列二进制数据。
  • 数据长度:取决于实际数据长度。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");float[] pixelData = dataset.Get<float[]>(DicomTag.PixelData);

25 VR: OL

  • 含义:Other Long(其他长整数)
  • 允许字符:一系列二进制数据。
  • 数据长度:取决于实际数据长度。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");int[] pixelData = dataset.Get<int[]>(DicomTag.PixelData);

5. 其他类型

26 VR: OB

  • 含义:Other Byte String(其他字节字符串)
  • 允许字符:任何字节序列。
  • 数据长度:无限制。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");byte[] pixelData = dataset.Get<byte[]>(DicomTag.PixelData);

27 VR: OW

  • 含义:Other Word String(其他字字符串)
  • 允许字符:任何16位二进制整数序列。
  • 数据长度:无限制。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");ushort[] redPaletteColorLookupTableData = dataset.Get<ushort[]>(DicomTag.RedPaletteColorLookupTableData);

28 VR: SQ

  • 含义:Sequence of Items(数据元素序列)
  • 允许字符:由多个数据元素组成的序列,每个数据元素都以属性标签为序列头,并有可能包含其他数据元素。
  • 数据长度:无限制。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");var sequence = dataset.Get<DicomSequence>(DicomTag.ReferencedPerformedProcedureStepSequence);
foreach (var item in sequence.Items)
{var referencedSOPClassUID = item.GetString(DicomTag.ReferencedSOPClassUID);var referencedSOPInstanceUID = item.GetString(DicomTag.ReferencedSOPInstanceUID);// ...
}

29 VR: UN

  • 含义:Unknown(未知类型)
  • 允许字符:一系列二进制数据。
  • 数据长度:取决于实际数据长度。
  • 读写示例方法:
DicomDataset dataset = new DicomDataset();
dataset.Load(@"path/to/dicom/file.dcm");byte[] unknownData = dataset.Get<byte[]>(DicomTag.UnknownTag);

总结

以上是DICOM元素值中常见的数据类型的VR,含义、允许字符、数据长度和读写示例方法等内容。根据DICOM数据集中具体元素的VR,选择合适的读取方法来获取元素的值。


http://www.mrgr.cn/news/34427.html

相关文章:

  • Move开发语言在区块链的开发与应用
  • Scala入门基础(17.1)Set集习题
  • 关于Unity使用LookAt时为什么不能旋转
  • Collections.synchronizedList()你真的会用吗?
  • 七大经典基于比较排序算法【Java实现】
  • Qt 监控USB设备的插入和移除
  • 【计算机网络】传输层协议TCP
  • 好用的idea方法分隔符插件
  • 计算机网络发展
  • 【AI创作组】MATLAB基础语法总结
  • C# 中yield 的使用详解
  • 【基础知识】网络套接字编程
  • html,js,react三种方法编写helloworld理解virtual dom
  • Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示
  • 《机电工程技术》
  • 西门子PCS7在CFC中如何连接DB块中的变量
  • 【智能制造-32】通信冗余
  • 基于python深度学习遥感影像地物分类与目标识别、分割实践技术
  • 全流程管理的商标管理软件如何实现一站式品牌保护?
  • 【安装教程】Windows环境下Neo4j的安装与配置
  • Redis面试常见问题
  • Matplotlib-数据可视化详解
  • 【项目开发】跨学科合作平台原型设计
  • 如果在事务中使用update语句更新但是条件中没有使用主键,会使用什么级别的锁?
  • 利用代码,玩转腾讯云脱敏服务:Java、Python、PHP案例集
  • 【常见框架漏洞】ThinkPHP、struts2、Spring、Shiro