赞
踩
想要了解DICOM,我们必须先知道什么是DICOM?
来自度娘的解释:DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义了质量能满足临床需要的可用于数据交换的医学图像格式。
一般DCM文件包含四级属性,每个级别都有像数据库中主键一样的特殊的键值,用来唯一标识它。
对于患者来说,可以用Patient Id来唯一标识;
此时有同学可能发现,为何Patient 不像其他项一样有instance Uid呢 ???, 这是因为在不同的医院,信息系统基本不一致,就可能出现不同的PatientID,在国内,我们每个人有唯一的身份证号来区分,但每个医院自己的PatientID无法保证一致性。
医院医生关注更多的是 检查(study),对于患者,可以通过4要素进行关联确定。
患者4要素,ID,Name, Birthdate, Gender一般情况下,只有四要素相同时,才会判断是同一个患者;
在患者4要素中,有两个要注意的地方,一个是年龄,另一个是性别。
对于年龄,每个医疗影像厂商有自己的设计方案,有的采用标准的patient-study-series-image标准结构,此时可以用dicom文件中的出生日期来计算年龄;但也有部分医疗影像厂商采用study-series-image的结构,再调用不同的检查时,运用的就是检查时期的年龄了;
对于Gender,有4种定义(Male\Female\Other,还可以为空),因为在DICOM定义中,Patient这个对象也可以代表动物哦!
对于检查来说,可以用Study Instance UID来唯一标识;
Sduty有以下几种重要属性,以及其相应的tag
其中的Study ID由用户或设备生成
对于序列来说,可以用Series Instance UID来唯一标识;
Series有以下几种重要属性,以及其相应的tag
对于医生来说,图像质量和挂片协议很重要,这些属性都是他挂片的条件
对于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 等传输语义
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,最好也要填,填的信息越多,在医院用的时候会很方便,在其他家厂商使用时解析也会很方便。
在解析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文件中为空时,可以正常取出来,但其值是空,所以应该加上后面的或判断
在导出DICOM文件或者把dataset保存为DICOM时,我们一般使用SetNullValue
当planlabel为空时,直接把置为空,可以直接使用以下方式,
···· string planLabel = DbDeliveryGroup.planlabel;
····if (string.IsNullOrEmpty(planLabel))
{
DataSet[DicomTags.RtPlanLabel].SetNullValue();
}
//也可以不对其进行判空处理,直接保存也可以
DataSet[DicomTags.RtPlanLabel].SetNullValue();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。