技术文章和通讯

访问DICOM文件中的数据

作者:Jeff Mather, MathWorks


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

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

在DICOM之前:混乱

DICOM显著改善了医疗设备之间的通信,降低了集成硬件和软件解决方案的成本和复杂性。在DICOM之前,每个制造商都使用专有的图像格式和通信协议将其硬件解决方案与第三方产品连接起来。2022世界杯八强谁会赢?整合来自不同供应商的医疗硬件和软件意味着从一个供应商的协议转换到另一个供应商的协议。这一过程混乱不堪,困难重重。为提供数据翻译服务而发展起来的家庭手工业。

随着1993年DICOM作为正式标准的出现,一个协议取代了许多协议和格式。DICOM是通用格式,便于集成来自不同供应商的解决方案。例如,可以在不使用翻译设备的情况下,将GE医疗系统的MR扫描仪与Agfa的图片归档系统(PACS)和其他供应商的胶片打印机集成在一起。集成不仅仅局限于硬件。支持DICOM的MATLAB等软件可以与所有这些设备共享图像,前提是每个硬件设备都实现了必要的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. ')dcm的p);X(:,:,1,p) = dicomread(filename);结束
显示图像堆栈。蒙太奇(X, [])

在运行这段代码之后,MATLAB工作区包含一个4-D数组和图像数据,并显示一个MR切片图。

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

您可以使用MATLAB和图像处理工具箱对这些数据执行多个任务。例如,MATLAB提供了复杂的体可视化技术,从这些切片重建一个3-D表面,然后应用表面和照明效果。的“帮助”部分中的示例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]);
fname = sprintf('brain_%03d. ')dcm的p);X(:,:,:,p) = dicomread(fname);结束

我们仍然理所当然地认为图像包含有签名的数据& sdash;“PixelRepresentation”的值“1”表示这种类型的数据——但我们需要的其他信息很容易获得。我们可以使用这个元数据和imlincomb函数来缩放图像数据以填充整个16位动态范围。用于重新缩放灰度值的线性组合是“y = (x - b) * m”,其中b是x的最小值,m是由输入和输出范围派生的恒定比率。

跟踪最小和最大像素值。minPixels = repmat(0, [1, nFrames]);maxPixels = repmat(0, [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规范包含许多内容信息对象定义(iod),如MR图像,超声多帧图像,放疗计划。上面示例中的DICOM文件包含MR图像信息对象。dicomread理解DICOM规范中列出的大多数iod。

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

MR Image IOD中的模块:

模块描述患者的详细信息一套成像程序患者研究(U)研究时患者的信息一般系列某一特定成像程序的一般信息参考系将一系列图像在空间上联系起来的信息一般设备产生该系列的图像形态的一般信息一般图像在系列中识别和描述图像的细节图像平面切片厚度/位置/间距和其他方向细节图像像素对比/Bolus (C)成像时给予药物的详细信息MR磁共振成像特定的图像值叠加平面(U)与特定图像显示的图形或位图文本VOI LUT (U)转换图像对比度或强度的信息SOP消息创建的通用日期/时间和其他通用DICOM细节

一些模块,如病人、一般研究、一般设备和图像像素,在许多iod中都有。其他模块只出现在特定的iod中。例如,MR图像模块只是MR图像IOD的一部分。

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

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

编写DICOM文件

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

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

若要使用默认元数据将缩放图像的第十帧写入新文件,请使用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数据的文件非常类似于执行Storage服务。本质上,IOD的属性加上存储服务的属性在写入磁盘时被组合并“冻结”。读取文件将“解冻”IOD和服务属性,并保留处理信息的整个上下文。

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

一起工作

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

考虑到所有这些可能性——iod、可选模块、服务和传输语法——可能很难确切地知道两种模式的交互效果如何。实现服务需要知道发送或接收哪些属性。此外,要使服务经常有用,就需要知道将什么类型的数据放入属性并验证信息是正确的。因此,很少有制造商支持DICOM中可能的全套“服务-对象对”。此外,不同的应用程序支持不同的传输语法。

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

无限的可能性与DICOM

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

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

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

2002年出版的

查看相关行业文章

Baidu
map