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.xdnf.cn/news/1544375.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣最热一百题——最小覆盖子串

目录 题目链接&#xff1a;76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;滑动窗口 1. 初始化 2. 构建 mapT 3. 滑动窗口 4. checkT 方法 5. 返回结果 Java写法&#xff1a; 运行时间 C写法&#x…

人工智能与自然语言处理发展史

前言 在科技的浪潮中&#xff0c;人工智能 (AI) 作为一股不可阻挡的力量&#xff0c;持续推动着社会与科技的进步。本博客旨在深入剖析人工智能及其核心领域——神经网络、自然语言处理、统计语言模型、以及大规模语言模型——的演进历程&#xff0c;以专业的视角展现这一领域…

基于C语言开发(控制台)通讯录管理程序

通讯录程序设计 一、课程设计题目与要求 题目 &#xff1a;通讯录管理程序 1. 问题描述 编写一个简单的通讯录管理程序。通讯录记录有姓名&#xff0c;地址(省、市(县)、街道)&#xff0c;电话号码&#xff0c;邮政编码等四项。2. 基本要求 程序应提供的基本基本管理功能有…

豆包 MarsCode 代码练习体验

我最近体验了豆包MarsCode的代码练习&#xff0c;感觉非常棒&#xff01;首先&#xff0c;进入平台后&#xff0c;界面简洁明了&#xff0c;使用起来非常方便。选择内置题目时&#xff0c;题目类型丰富多样&#xff0c;涵盖了基础知识和一些进阶挑战&#xff0c;非常适合不同水…

【Kubernetes知识点】解读HPA的 thrashing(抖动)问题

【Kubernetes知识点】解读HPA的 thrashing&#xff08;抖动&#xff09;问题 目录 1 概念 1.1 什么是 Thrashing 现象&#xff1f;1.2 HPA 中 Thrashing 产生的原因1.3 解决 Thrashing 的优化措施 1.3.1 设置合适的阈值1.3.2 使用自定义指标和基于负载的自动扩缩1.3.3 增加扩…

探寻大模型时代智慧农业新未来,商汤与上海市农委达成战略合作

近日&#xff0c;在中国农民丰收节上海会场丰收庆典活动上&#xff0c;商汤科技与上海市农业农村委员会&#xff08;下称&#xff1a;上海市农委&#xff09;签署战略合作协议&#xff0c;双方将依托先进的AI大模型技术&#xff0c;共同推进上海智慧农业发展&#xff0c;打造国…

基向量和投影矩阵

文章目录 1. 投影向量2. 基向量&#xff0c;列向量秩1分解3. SVD&#xff0c;奇异向量秩1分解4. 小结&#xff1a;5. 图解分析 1. 投影向量 假设我们有一个向量b和一个向量q,求向量b在向量q上的投影向量p: 求向量p的长度&#xff1a; q T b ∣ q ∣ ⋅ ∣ b ∣ ⋅ cos ⁡ …

UNet 眼底血管分割实战教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 在医学影像分析领域&#xff0c;准确地分割眼底血管对于眼科疾病的诊断和治疗至关重要。…

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

关于yolov5训练需要更改的参数汇总

首先我给大家展示一下项目目录 第一步我们需要修改data文件夹下的voc.yaml文件&#xff0c;这里我复制了一份改名为hat.yaml 需要修改第21&#xff0c;22行的路径&#xff0c;train是图片的训练集&#xff0c;val是图片训练的验证集&#xff0c;nc是标签的数量&#xff0c;name…

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 遇到SSH连接银河麒麟V10SP1时“connection reset by ip地址 port 22”的错误&#xff0c;可以尝试以下步…

深入浅出热门AI大模型,新手到专家的必备指南《实战AI大模型》

今天&#xff0c;人工智能技术的快速发展和广泛应用已经引起了大众的关注和兴趣&#xff0c;它不仅成为技术发展的核心驱动力&#xff0c;更是推动着社会生活的全方位变革。特别是作为AI重要分支的深度学习&#xff0c;通过不断刷新的表现力已引领并定义了一场科技革命。大型深…

矿区车辆4G视频监控解决方案

一、背景介绍 随着科技的发展和矿山产业的不断进步&#xff0c;矿区的安全问题越来越受到关注。尤其是矿区车辆的运行安全&#xff0c;更是重中之重。为了更好地对矿区车辆进行监控和管理&#xff0c;提高运行安全性&#xff0c;4G视频监控解决方案应运而生。 二、需求分析 1…

Nmap网络扫描器基础功能介绍

怎么快速知道网络中存在哪些设备呢&#xff1f;我们可以借用扫描工具Nmap来实现这个功能。 下载 Windows系统可以前往Nmap官网下载安装包。 Linux使用对应的包管理器可以直接安装&#xff0c;命令如下 # Debian/Ubuntu apt install nmap# RedHat/Fedora yum install nmap …

全西安前十的数字媒体产业链都在这

在古城西安&#xff0c;有一处汇聚着创新与活力的地方&#xff0c;那便是西安国际数字影像产业园。这里&#xff0c;承载着西安数字媒体产业的未来与希望&#xff0c;成为了数字媒体产业链的闪耀聚集地。 西安国际数字影像产业园以其独特的魅力和优势&#xff0c;吸引了众多数字…

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录 Linux环境下配置安装VScode并配置Go语言开发环境Go语言源码的组织方式Go语言源码安装后的结果Go程序构建和安装的过程go build扩展go get 命令详解 之前学习过Go语言&#xff0c;学习的时候没有记录笔记&#xff0c;最近找了个极客时间的Go语言36讲&#xff0c;打算时间学…

004_动手实现MLP(pytorch)

import torch from torch import nn from torch.nn import init import numpy as np import sys import d2lzh_pytorch as d2l # 1.数据预处理 mnist_train torchvision.datasets.FashionMNIST(root/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist, t…

二刷LeetCode:“51.N皇后 37.解数独”题解心得(简单易懂)

引言&#xff08;初遇噩梦&#xff0c;再遇坦然&#xff09; 在阅读本文之前&#xff0c;建议大家已经接触过回溯算法&#xff0c;并完成回溯相关题目&#xff0c;例如&#xff1a;子集问题、组合问题、排列问题。 子集&#xff1a;子集II、子集 组合&#xff1a;组合、组合总和…

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

Scanner流程控制语句

1. Scanner类 Scanner的意思是扫描 Scanner是JDK提供的一个类&#xff0c;位于java.util包下&#xff0c;所以我们如果需要使用则必须导包&#xff0c;导包的语句必须在声明包之后&#xff0c;在声明类之前 Scanner类是用来接受用户输入的各种信息 Scanner类提供了用于接受…