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,选择合适的读取方法来获取元素的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dotnet研习社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值