技术文章和通讯

访问DICOM文件中的数据

杰夫·马瑟(Jeff Mather), MathWorks


DICOM(医学数字成像和通信)格式描述了如何在成像模式(.、计算机断层扫描(CT)、磁共振(MR)和超声波设备),并定义了一套通过网络传输它们的操作。这些消息还可以写入文件,以便脱机存储在图片存档系统、CD或其他类型的存储设备上。dicom格式的消息结合了图像和元数据,创建了丰富的医学成像过程描述。这种格式非常详细,其规范长度超过2500页。

MATLAB和图像处理工具箱提供对DICOM数据的方便访问。访问DICOM文件中的数据变得与处理TIFF或JPEG图像一样简单。本文介绍了使用DICOM的示例,并提供了关于这种格式的背景信息。

之前DICOM:混乱

DICOM显著改善了医疗设备之间的通信,降低了集成硬件和软件解决方案的成本和复杂性。金宝搏官方网站在DICOM之前,每个厂商都使用专有的图像格式和通信协议来连接自己的硬件解决方案和第三方产品。金宝搏官方网站下载188bet金宝搏整合来自不同供应商的医疗硬件和软件意味着从一个供应商的协议转换到另一个供应商的协议。这个过程是混乱的,充满了困难。一个提供数据翻译服务的家庭手工业发展起来了。

随着1993年DICOM作为正式标准的出现,一个协议取代了许多协议和格式。DICOM是一种通用格式,可以方便地集成来自不同供应商的解决方案。金宝搏官方网站例如,可以在不使用翻译设备的情况下,将通用电气医疗系统公司的磁共振扫描仪与爱克发公司的图片存档系统(PACS)和其他供应商的胶片打印机集成在一起。集成不仅仅局限于硬件。支持DICOM的软件(如MATLAB)可以与所有这些设备共金宝app享图像,前提是每个硬件设备都实现了必要的DICOM服务。

第一个简单的例子

在医学影像学中,病人接受影像学检查研究,其中可能包含多个系列的图像。每个系列都是在一个单独的形态例如磁共振、CT或x光设备,可以有多个相关的图片.假设我们有一项研究包含了20张横向MRI大脑图像我们想把它们读入MATLAB。(这20个映像存储在20个DICOM文件中,文件名如下brain_017.dcm,你可以从上面下载MATLAB中央如果您想运行示例。)假设我们知道每个图像是256 × 256的,并且包含有符号的16位数据。我们可以用下面的代码来阅读这个系列:

%预分配256 × 256 × 1 × 20的图像数组。X = repmat(int16(0), [256 256 1 20]);
%读取图像系列。For p=1:20 filename = sprintf('brain_%03d. txt ')dcm的p);X (:: 1, p) = dicomread(文件名);结束
显示图像堆栈。蒙太奇(X, [])

运行此代码后,MATLAB工作空间包含带有图像数据的4-D数组,并出现MR切片图。

点击图像查看放大视图。

您可以使用MATLAB和图像处理工具箱使用这些数据执行多个任务。例如,MATLAB提供了复杂的体积可视化技术,从这些切片重建一个三维表面,然后应用表面和照明效果。帮助部分中的示例isocaps函数显示了这个实现。的imtransformtformarray函数可以方便地从横向数据中提取不同方向的切片。例如,“从三维MRI数据集提取切片示例演示了如何从一个类似的数据集提取矢状切片。还可以使用图像处理工具箱中的形态学函数执行图像分割、特征提取和图像统计等操作。或者,您可以编写自己的函数来执行体积估计、收缩包装等。

访问DICOM元数据

在前面的示例中,我们在预分配存储阵列时做了几个假设。所有这些假设都基于DICOM文件中存在的元数据。此外,图像像素的值被限制在图像总的可能动态范围内的一个狭窄的范围内,因此我们必须将一个空数组作为特殊参数传递给蒙太奇重新缩放数据。让我们使用DICOM文件中的元数据属性(1)智能地预分配数组,(2)重新缩放数据值以填充16位动态范围。

因为系列中的所有图像必须具有相同的维数和位深,所以我们只需要从系列中的一个图像中获取元数据就可以预分配数组。的图像处理工具箱函数dicominfo返回DICOM文件中的元数据。

如您所见,有许多元数据值,或者属性.“Rows”、“Columns”和“BitsStored”的值确切地告诉我们需要知道的内容,我们可以重写读取图像堆栈的代码。

nRows = info.Rows;nCols = info.Columns;nPlanes = info.SamplesPerPixel;nFrames = 20;%目录中的文件数
X = repmat(int16(0), [nRows, nCols, nPlanes, nFrames]);
for p = 1:nFrames fname = sprintf('brain_%03d. txt ');dcm的p);X (:,:,: p) = dicomread(帧);结束

我们仍然想当然地认为图像包含有signed data,“PixelRepresentation”的值为“1”表示该类型的数据,但是我们需要的其他信息很容易获得。我们可以使用这些元数据和imlincomb函数来重新缩放图像数据以填充整个16位动态范围。重新缩放灰度值的线性组合是“y = (x - b) * m”,其中b是最小的x值,m是来自输入和输出范围的常数比。

%跟踪最小和最大像素值。minPixels = repmat(0, [1, nFrames]);maxPixels = repmat(0, [1, nFrames]);
for p = 1:nFrames fname = sprintf('brain_%03d. txt ');dcm的p);信息= dicominfo(帧);minPixels (p) = info.SmallestImagePixelValue;maxPixels (p) = info.LargestImagePixelValue;结束
%重新缩放图像,从0开始。b = min (minPixels);m = 2^16/(max(maxPixels) - b);Y = imlincomb(m, X, -(m * b), 'uint16');

DICOM元数据详细信息

如前一个示例所示,一个典型的DICOM文件包含许多属性。这样做的原因是DICOM消息封装所有有关医学成像过程的信息,包括有关患者、研究、成像方式和图像系列的详细信息,以及存储在文件中的图像框架。所有这些属性一起组成一个信息对象。

DICOM规范包含许多信息对象定义(iod),如MR图像、超声多帧图像、放疗计划等。上面示例中的DICOM文件包含MR图像信息对象。dicomread理解DICOM规范中列出的大多数iod。

iod被定义为更小的功能单元,或模块,对应于具体的现实世界对象,如病人、成像设备等。DICOM中的大约100个模块描述了可以组合成DICOM信息对象的所有内容。例如,下表列出了构成MR Image IOD的模块:

MR Image IOD中的模块:

模块描述关于患者的详细信息成像过程的一组病人研究(U)病人信息的研究一般系列一般信息关于一个特定的成像过程的参照系信息空间与图像在一系列通用设备通用图像形态的信息生产系列通用图像细节,识别和描述系列图像平面内的一个图像切片厚度/位置/间距和其他方向的细节图像像素的实际图像像素和如何解释他们的信息对比/丸(C)药物的详细信息给先生成像时图像值特定于磁共振成像叠加平面(U)用于显示特定图像的图形或位图文本VOI LUT (U)用于转换图像的对比度或强度的信息SOP用于创建消息的通用日期/时间和其他通用DICOM细节

一些模块,如患者,一般研究,一般设备,和图像像素,在许多iod中都可以找到。其他模块只出现在特定的iod中。例如,MR Image模块只是MR Image IOD的一部分。

IOD包含描述特定医学成像过程的患者、研究、系列和图像的模块。另外,注意一些模块的名称附近有一个“(C)”或“(U)”,这意味着对于这个IOD,它们是“有条件要求的”或“用户可选的”模块;条件模块和用户可选模块可能出现,也可能不会出现在每个MR Image IOD中。例如,对比/Bolus模块只在成像时给药时才会出现,VOI LUT模块不必由写入DICOM文件的设备实现。

所有的模块和属性都在DICOM规范的PS 3.3中定义,可以从全国电气制造商协会.此外,所有定义的属性都在数据字典中列出。供应商有时会定义特定于其硬件的私有属性。而您不需要执行任何特殊操作来读取私有属性dicomreaddicominfo,如果您想提供不属于DICOM规范的属性的附加信息,您可以提供自己的数据字典。

写作DICOM文件

现在,我们将创建一个新的DICOM文件。写入新文件需要图像和元数据。在上面的一个例子中,我们用缩放后的数据创建了一个新图像dicomwritedicominfo将帮助我们创建所需的元数据。

要编写DICOM文件,只需使用dicomwrite图像处理工具箱.目前,该函数支持创建Secondary Captu金宝appre (SC) Image iod,其中包含正确解释图像所需的所有像素数据和元数据。从本质上讲,SC图像类似于您使用帧捕捉器生成的图像,或者您自己从头或从另一个图像生成的图像(如上面的示例)。将显示关于患者、图像和研究的元数据,但不会显示生成图像的原始硬件的信息。

要使用默认元数据将缩放后的图像的第十帧写入新文件,请使用dicomwrite基本语法:

帧= Y (:,:,: 10);文件名=“brain_scaled_10.dcm”;dicomwrite(框架、文件名)

在这个例子中,dicomwrite推断所需的元数据,在适当的地方填充空白值。若要覆盖默认值,请提供dicomwrite使用包含属性的结构:

信息= dicominfo(“brain_001.dcm”);dicomwrite(帧,文件名,信息)

dicomwrite选择应用于Secondary Capture IOD的值,并忽略其余的。当dicomwrite创建一个新文件时,它实际上执行了两个操作。首先,它创建一个Secondary Capture信息对象。然后,它对信息对象的属性进行编码,将它们转换为写入输出文件的字节流。最后一步演示了DICOM的概念服务

服务提供了一组要在对象上执行的具体操作。常见的服务包括存储、打印管理、验证和查询/检索。在处理网络消息时,服务是通过向消息添加额外的属性,然后向接收机器或应用程序发送一系列指令来实现的,接收机器或应用程序解码额外的属性,以确定如何处理消息。当使用DICOM文件时,属性被添加到文件中,写入或读取文件将替换指令的传输。

写入包含DICOM数据的文件非常类似于执行Storage服务。本质上,IOD的属性和Storage服务的属性是结合在一起的,并且在写到磁盘时“冻结”。读取文件“解冻”了IOD和服务属性,并且保留了处理信息的整个上下文。

DICOM标准中的编码规则提供了将属性转换为要传输或存储的一系列字节的算法。在编码过程中可以使用不同的字节排序方案,并且可以使用多种技术来压缩图像像素,例如JPEG或行程长度编码。在对dicomwrite在上面,文件使用所谓的“隐式VR,小端序”风格编码,像素不压缩。

一起工作

一大堆传输语法明确定义如何解码DICOM消息。其中一种传输语法出现在DICOM网络传输的开头或DICOM文件的开头。如果发送方/写入方和接收方/读取方都支持相同的传输语法,则通信将继续进行。金宝app否则,沟通失败。MATLAB中的DICOM特性和图像处理工具箱支持最常用的传输语法。金宝app

有了所有这些可能性(iod、可选模块、服务和转换语法),就很难确切地知道两种模式之间的相互作用有多好。实现服务需要知道要发送或接收哪些属性。此外,要使服务有用,通常需要知道将什么类型的数据放入属性中,并验证信息是否正确。因此,很少有制造商支持DICOM中可能的全套“服务-对象对”。金宝app此外,不同的应用程序支持不同的传输语法。金宝app

幸运的是,每个实现了部分DICOM的应用程序都应该知道它支持什么。金宝app制造商发布关于他们在DICOM中支持的服务、iod和传输语法的信息金宝app一致性声明.通过比较来自两个不同供应商的语句,您可以确定两个应用程序是否可以共享信息。

DICOM的无限可能

DICOM使获取医学图像并将其放入文件变得容易。它在医学领域变得越来越普遍。

许多医疗设备制造商和软件制造商正在将DICOM添加到几乎所有能够处理医疗图像和数据的产品中。

使用MATLAB和图像处理工具箱可以方便地访问DICOM文件中的医学图像、模态元数据和患者信息。它们还提供数值和图像处理算法、gui构建工具和可视化技术。通过MATLAB、图像处理工具箱和DICOM,可以快速查看医学图像,设计和测试新的模式,并创建gui驱动的医学图像分析系统。

2002年出版的

查看相关行业的文章