医疗DICOM入门知识

想要了解DICOM,我们必须先知道什么是DICOM?
来自度娘的解释:DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义了质量能满足临床需要的可用于数据交换的医学图像格式。

一般DCM文件包含四级属性,每个级别都有像数据库中主键一样的特殊的键值,用来唯一标识它。

四级属性

患者(Patient)

对于患者来说,可以用Patient Id来唯一标识;

此时有同学可能发现,为何Patient 不像其他项一样有instance Uid呢 ???, 这是因为在不同的医院,信息系统基本不一致,就可能出现不同的PatientID,在国内,我们每个人有唯一的身份证号来区分,但每个医院自己的PatientID无法保证一致性。
医院医生关注更多的是 检查(study),对于患者,可以通过4要素进行关联确定。
患者4要素,ID,Name, Birthdate, Gender一般情况下,只有四要素相同时,才会判断是同一个患者;
h
在患者4要素中,有两个要注意的地方,一个是年龄,另一个是性别。
对于年龄,每个医疗影像厂商有自己的设计方案,有的采用标准的patient-study-series-image标准结构,此时可以用dicom文件中的出生日期来计算年龄;但也有部分医疗影像厂商采用study-series-image的结构,再调用不同的检查时,运用的就是检查时期的年龄了;

对于Gender,有4种定义(Male\Female\Other,还可以为空),因为在DICOM定义中,Patient这个对象也可以代表动物哦!

检查(Study)

对于检查来说,可以用Study Instance UID来唯一标识;
Sduty有以下几种重要属性,以及其相应的tag
其中的Study ID由用户或设备生成
tag值

序列(Series)

对于序列来说,可以用Series Instance UID来唯一标识;
Series有以下几种重要属性,以及其相应的tag
对于医生来说,图像质量和挂片协议很重要,这些属性都是他挂片的条件
在这里插入图片描述

影像(Image)

对于Image 而言,其中的采集的日期、时间,类型也是重要的挂片条件。
在这里插入图片描述

编码方式

传输语义(Transfer Syntax), ImplicitLittleEndian, ExplicitLittleEndian, ExplicitBigEndian, Encapsulated

数据类型

DICOM中的数据类型基本囊括我们常用的类型,字符串类型就有很多细分, VR (PN, CS, AE, LT, ST, LO, IS, DS, OB, OW, SQ 等), 具体可以参考DICOM标准3-5中的数据字典。
PN–patient name, 64字节长,可由最多3种姓名比如日文罗马名=汉字名=假名,每个姓名部分又最多可由5部分组成,够复杂了。不过这是因为各地区,文化有自己的称呼习惯。

CS- code string, 由大写的A-Z, 数字0-9, 下划线,空格组成,比如Modality type 就是CS类型,一般用于表示一些特定的枚举值。

DA- date, 日期,yyyymmdd 中间没有任何符号,但一些老标准中允许有符号比如yyyy-mm-dd,这在一些老设备中会出现,我们也要多留意。

Character set,为了兼容多个地区语言,DICOM定义了Character set (0008,0005)来处理不同地区的编码,这个是tag 的type是1C, “Required if an extended or replacementcharacter set is used in one of the keys”,国内使用的是GB18030,在台湾地区使用utf-8

定义某些数据类型比如SH,LO,PN 等可采用特定编码,也允许采用多种混合编码方式,方便用户录入。

传输语义

DICOM为利用各种已有的图像压缩技术和计算机平台,定义大量的传输语义,implictlittleendian,explicitlittleedian, explicitbigendian, JPEG Loseless, JPEG Lossy, RLE, JPEG2K, MPEG2, MPEG4.
最近几年为应用一些新的IT,支持一些影像以外的应用 还陆续添加了JPIP, Encapsulated PDF,Deflated 等传输语义

IOD

DICOM标准3-3 IOD(Information Object definition)
是由多个特定的Module组成,有的是必填,有的是可选。在image 的IOD中, General Patient, General Study, General series, Image, Pixel 都是必须的,但像Overlay Plane 就是可选的。
每个Module中的一些属性,分为5个type,1, 1C, 2, 2C, 3,其中C为conditional

对于1, 属性必须存在,而且属性值不能为空;
对于1C, 在某些条件下 属性必须存在,而且属性值不能为空;
对于2, 属性必须存在,但可以为空;
对于2C, 在某些条件下必须要存在;
Type 3, 属性可有可无,如果有也可以为空;
对于Type 1, type 2 必须要有,同时对于一些重要的Type 3,最好也要填,填的信息越多,在医院用的时候会很方便,在其他家厂商使用时解析也会很方便。

读取tag值

在解析DICOM文件时,通常我们读取DICOM文件中的tag值,一般用TryGetString
以下我们以planLabel为例:

			string planLabel;
            if (_dataset[DicomTags.RtPlanLabel].**TryGetString**(0, out planLabel))
            {
                _dbDeliveryBeamGroup.planlabel = planLabel;
            }
			**此时可以发现,当RtPlanLabel这个tag 为空或者tag 不存在时,
		 	if (_dataset[DicomTags.RtPlanLabel].TryGetString(0, out planLabel))false,**
			同时也应该使用如下的做法:           
            string dgName;
            **if (!_dataset[DicomTags.RtPlanLabel].TryGetString(0, out dgName) || string.IsNullOrWhiteSpace(dgName))**
            {
                dgName = DICOMServiceUtility.DefaultPlanName;
            }
        此时应该有同学疑惑,为什么还要加一个 || 呢?
        因为当RtPlanLabel在dicom文件中为空时,可以正常取出来,但其值是空,所以应该加上后面的或判断

保存tag值

在导出DICOM文件或者把dataset保存为DICOM时,我们一般使用SetNullValue
当planlabel为空时,直接把置为空,可以直接使用以下方式,

····	string planLabel = DbDeliveryGroup.planlabel;
    ····if (string.IsNullOrEmpty(planLabel))
    	{
    		DataSet[DicomTags.RtPlanLabel].SetNullValue();
    	}                
		//也可以不对其进行判空处理,直接保存也可以
		DataSet[DicomTags.RtPlanLabel].SetNullValue();
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值