技术文章及通讯

访问DICOM文件中的数据

作者:Jeff Mather, MathWorks


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

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

在DICOM之前:混乱

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

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

第一个简单的例子

在医学成像中,病人要接受成像研究,可能包含多个系列的图像。每个系列都是在一个单一的形态例如MR, 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]);
阅读图像系列。对于p=1:20 filename = sprintf('brain_%03d. txt ')dcm的p);X(:,:,1,p) = dicomread(文件名);结束
显示图像堆栈。蒙太奇(X, [])

运行此代码后,MATLAB工作空间包含一个包含图像数据的4-D数组,并显示MR切片图。

dicom_fig1_w.jpg
点击图片查看放大视图。

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

访问DICOM元数据

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

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

dicom_code_w.gif

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

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

我们仍然必须理所当然地认为图像包含有符号的数据,“PixelRepresentation”值为“1”表示该类型的数据,但我们所需的其余信息很容易获得。我们可以将此元数据与imlincomb函数在图像处理工具箱中重新缩放图像数据,以填充整个16位动态范围。重新缩放灰度值的线性组合是“y = (x - b) * m”,其中b是最小x值,m是由输入和输出范围派生的常数比。

跟踪最小和最大像素值。minPixels = repmat(0, [1, nFrames]);maxPixels = repmat(0, [1, nFrames]);
对于p = 1:nFrames fname = sprintf('brain_%03d。dcm的p);Info = dicominfo(fname);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规范包含许多内容信息对象定义(IODs),如磁共振图像,超声多帧图像,放疗计划。上面示例中的DICOM文件包含MR图像信息对象。dicomread了解DICOM规范中列出的大多数iod。

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

MR Image IOD模块:

模块描述患者详细信息一般研究研究的一般信息,一组成像程序患者研究(U)研究时患者的信息一般系列关于一个特定成像程序的一般信息参考框架将一系列图像在空间上关联起来的信息一般设备关于产生该系列图像的图像模态的一般信息一般图像识别和描述该系列图像的细节图像平面切片厚度/位置/间距和其他方向细节图像像素对比度/Bolus (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文件。写入新文件需要映像和元数据。在上面的一个示例中,我们用缩放后的数据创建了一个新图像dicomwrite而且dicominfo能帮我们创建所需的元数据。

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

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

frame = Y(:,:,:,10);Filename = 'brain_scaled_10.dcm';dicomwrite(框架、文件名)

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

Info = dicominfo('brain_001.dcm');Dicomwrite (frame, filename, info)

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

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

写入包含DICOM数据的文件非常类似于执行存储服务。本质上,IOD的属性和存储服务的属性被组合在一起,并在写入磁盘时被“冻结”。读取文件“解冻”了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年出版的

查看相关行业的文章