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