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

【Dicom标准】dicom数据中pixelData显示处理流程详细介绍

文章目录

    • 1.概述
    • 2.Dicom
      • 2.1 Dicom标准
      • 2.2 Dicom文件
    • 3.转换流程
      • 3.1 GrayScale转P-Values
        • 3.1.1 Modality Transformation
        • 3.1.2 Mask Subtraction
        • 3.1.3 VOI Transformation
        • 3.1.4 Presentation Transformation
      • 3.2 Indexed Color转P-Values
    • 4.参考资料

1.概述

本文主要介绍使用dicom文件(.dcm)解析得到的pixelData按照dicom标准进行一系列处理,得到正确的显示效果。

2.Dicom

2.1 Dicom标准

DICOM​​Digital Imaging and Communications in Medicine,医学数字成像与通信标准)是医学影像领域的国际标准,用于规范医学影像的​​存储、传输、显示和共享​​。它由​​美国国家电气制造商协会(NEMA)和国际电气电子工程师学会(IEEE)​​共同制定,广泛应用于放射科(CT、MRI、X光)、超声、内窥镜、病理学等医疗影像设备。

2.2 Dicom文件

DICOM文件(扩展名通常为.dcm)是符合dicom标准的医学影像文件,不仅包含图像的像素数据,还包含丰富的元数据信息,如患者信息,检查信息,影像参数信息等。

用于Dicom数据查看的软件有Radiant Viewer、Weasis等,用于解析dicom数据的三方库有dcmtk、fo-dicom、pydicom,gdcm等。

3.转换流程

具体的dicom数据解析等不在本文不详细说明,这里只详细介绍pixelData像素到最终的显示值(P-Values)的转换流程。(以最新的2023 Dicom3.0作为本文的参考依据),且均以符合dicom标准的文件为例。

主要的转换流程如下表所示,以常用的CT影像的Dicom数据为例,主要包括两种情况:

(1)GrayScale Stored Pixel Values:即情况1,dicom文件中存储的像素灰度信息,需要经过Modality、VOI等步骤转换到最终的显示值。
(2)Indexed Color Stored Pixel Values:即情况2,dicom文件中存储原始像素和颜色查找表等信息,原始的像素值仅做为索引使用,从查找表中取值即可。
(3)True Color Stored Pixel Values:即情况3,即dicom文件中存储的像素值即为最终的显示值,无需任何转换,因此本文不额外讨论此情况。

在这里插入图片描述

3.1 GrayScale转P-Values

pixelData灰度值转P-Values(最终显示值)是最常见的处理流程,其中绝大部分dicom数据的显示都采用此种处理方式,包含以下几个步骤。

3.1.1 Modality Transformation

​​模态转换​​的作用是将依赖于设备制造商的原始像素值pixelData,转换为与影像模态相关且独立于制造商的标准化像素值(例如:CT模态的亨氏单位/Hounsfield number、胶片数字化仪的光学密度/Optical Density)。这些转换后的值可以表示物理单位,也可能是无量纲的。主要用于统一不同CT设备的灰度值范围(不同厂商在同类型的医学设备上生成的图像在度量上可能不一致,因此需要转换到一个标准的度量空间)。

模态转换的流程主要分为三种情况:
①使用Slope+Intercept Tag的线性变换;②使用Modality LUT颜色查找表的非线性变换;③前两种需要的Tag都不存在的情况。如下图所示

其中Rescale SlopeModality LUT Sequence互斥存在的,Rescale SlopeRescale Intercept必须同时存在的。
在这里插入图片描述

(1)Slope+Intercept
即使用斜率+截距的线性变化,ouput = input * slope + intercept;这里的输入input则为dicom数据解析出来的pixelData

(2)Modality LUT Sequence
即使用颜色查找表来进行非线性变化,后面的Modality LUT Sequence与Presentation LUT Sequence也类似。

LUT Data即颜色查找表的所有数据

LUT Descriptor中包含三个item,分别是:①查找表的元素数量第一个被映射的像素③查找表中每个元素的位数,是8bit还是16bit。按照这些描述,依次按照索引进行查找即可

(3)当以上两者的情况的Tag都不存在时,可以理解为无需做任何处理,也可以理解为slope为1,intercept为0;即ouput = input * slope + intercept公式为:ouput = input * 1 + 0 = output。

3.1.2 Mask Subtraction

可以理解为:使用mask数据进行遮罩处理,如CT扫描数据中包含了“床板”信息,可以根据Mask数据,去除床板。

即为简单的Mask遮罩,选择是否输出像素点,这里不过多赘述。

3.1.3 VOI Transformation

即感兴趣区转换,如使用窗宽窗位等显示特定区域范围等

感兴趣区转换包含以下几种种情况:

(1)使用窗宽窗位转换

要求:WindowCenter(0028,1052)WindowWidth(0028,1051)Tag存在。使用不同的转换公式取决于VOI LUT Function(0028,1056)Tag的枚举值,分为以下三种情况
LINEAR
默认情况,tag不存在时,即默认为LINEAR,转换公式如下所示:其中Ymax一般为1,Ymin一般为0;可以理解为按照窗宽窗位将原有的数据截取一定范围,并转换到预定值域。
在这里插入图片描述

LINEAR_EXACT

与上文①类似,只是转换公式稍有不同,如下截图所示:
在这里插入图片描述

SIGMOID
与上类似,使用不同的转换公式
在这里插入图片描述

(2)使用Lut颜色表转换
当WindowCenter Tag不存在时,可能会存在Lut的相关tag;包含LUT DescriptorLUT Data等相关Tag信息,具体的使用方式与上文Modality LUT相同,根据Descriptor中的描述,从LUTData中取值即可。
在这里插入图片描述

(3)以上两种情况所需的Dicom Tag均不存在
即窗宽窗位信息和LUT信息相关依赖的Tag都不存在,即全窗显示。可以理解为:将输入的值(值域为[Imin, Imax])全部映射到输出(值域为[Omin, Omax]),不存在截取的情况。

3.1.4 Presentation Transformation

即显示转换,包含使用LUT颜色表,以及根据Presentaton LUT Shape处理等方式

(1)使用Presentation LUT Sequnence进行处理。

即使用LUT查找表的方式进行处理,与上文中的类似,这里不过多赘述。

在这里插入图片描述
(2)根据Presentation LUT Shape(2050,0020)Tag进行处理
包含以下几种枚举:

IDENTITY:即输入的值为P-Values,无需在进行任何处理
INVERSE:需要对输入的值进行反色处理,即在Shader中根据此Tag反色处理即可。

3.2 Indexed Color转P-Values

原始的Dicom数据自带颜色查找表(Palette Color Lookup Table)数据,直接根据原始的像素值在LUT中按照规则查找处理即可,不需要上文3.1部分中的各个步骤。

在这里插入图片描述
当原始数据自带Red、Green、Blue Palette Color Lookup Table Descriptor时,且相应的Tag需要满足要求,如Photometric Interpretation(0028,0004) Tag的值为PALETTE COLOR时,直接将Dicom数据中的像素值作为索引,从LUT中取相应的值即可。具体的规则与用法与上文基于LUT Descriptor的方式相同,这里不过多赘述。

在这里插入图片描述

4.参考资料

  • https://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_N.2.html:传送门
  • Modality LUT Module:传送门
  • VOI LUT Module:传送门
  • Presentation LUT Module:传送门
  • Palette Color Lookup Table Module:传送门
  • Red Palette Color Lookup Table Descriptor Attribute:传送门
http://www.xdnf.cn/news/14564.html

相关文章:

  • Linux 服务器运维:磁盘管理与网络配置
  • 一个免费的视频、音频、文本、图片多媒体处理工具
  • ICM-20948 Wake on Motion功能开发全过程(8)
  • Python 的内置函数 hash
  • python模块常用语法sys、traceback、QApplication
  • 操作系统内核态和用户态--2-系统调用是什么?
  • 决策树:化繁为简的智能决策利器
  • GO语言---数组
  • 【Docker基础】Docker镜像管理:docker rmi、prune详解
  • 经典:在浏览器地址栏输入信息到最终看到网页的全过程,涉及网络协议以及前后端技术
  • Vue状态管理实践:使用Vuex进行前端状态管理
  • FVISION 未来视界工作室:AI驱动的创新与智能外包平台
  • TodoList 案例(Vue3): 使用Composition API
  • Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络
  • 基于SpringBoot+Uniapp的活动中心预约小程序(协同过滤算法、腾讯地图、二维码识别)
  • 【论文笔记】【强化微调】TinyLLaVA-Video-R1:小参数模型也能视频推理
  • SQLite 数据库操作完整指南
  • Spring Boot邮件发送终极指南:从基础到高级应用
  • AI大模型学习之基础数学:高斯分布-AI大模型概率统计的基石
  • RocketMQ--为什么性能不如Kafka?
  • Mac电脑-Markdown编辑器-Typora
  • springboot垃圾分类网站
  • 浅议 3D 展示技术为线上车展新体验带来的助力​
  • Qt的学习(七)
  • Kubernetes多容器Pod实战
  • 操作系统进程与线程核心知识全览
  • 一个小BUG引发的对Mybatis-Plus的模糊查询的思考
  • C 语言结构体:从基础到内存对齐深度解析
  • word-spacing 属性
  • 那些年,曾经辉煌过的数据库