跳转到内容

MINC/工具/emma/emma-demo1

来自维基教科书,开放的书籍,为开放的世界

基本 EMMA 图像操作

[编辑 | 编辑源代码]

EMMA(可扩展的 MATLAB 医学分析)是一个通用的 MATLAB 函数工具包,旨在帮助研究人员进行 MATLAB 下的图像分析。它提供用于读取 MINC(医学图像 Net CDF)文件、写入 MINC 文件、显示图像以及对图像进行一般操作的函数。

从文件读取图像

[编辑 | 编辑源代码]

让我们从一个快速演示开始。我们将从存储在 MINC 文件中的动态 PET 中读取 21 帧,并显示该数据集中的一个帧。首先,我们必须打开文件。EMMA 函数openimage打开图像文件以供读取,并返回句柄。因此,我们这样调用它

h=openimage('/local/matlab/toolbox/emma/examples/yates_19445.mnc');

变量h现在是用于处理此图像文件(其实际值对用户不重要)的句柄。现在文件已打开,我们可以使用 EMMAgetimages函数读取它。我们将从研究的第 8 片中读取所有 21 帧

PET=getimages(h,8,1:21);

变量PET现在包含第 8 片的每一帧的图像。我们可以使用 MATLABwhos命令查看我们拥有的变量及其大小

>> whos
              Name        Size       Elements     Bytes    Density   Complex

               PET   16384 by 21       344064   2752512       Full      No
                 h       1 by 1             1         8       Full      No

Grand total is 344065 elements using 2752520 bytes

图像本身为 128 像素 x 128 像素(16384 个元素),并由 EMMA 以列形式存储。当getimages函数读取图像时,它会将图像的行连接在一起以形成一列。因此,之前读取的PET变量包含 16384 行(128x128=16384)和 21 列(21 个图像)。虽然这乍一看可能有些笨拙,但它允许在 MATLAB 下进行高效的图像操作。

查看图像

[编辑 | 编辑源代码]

我们可以使用 EMMAviewimage函数从该数据集中查看一个图像。它接受以列格式存储的图像(如刚刚描述的那样),或作为矩阵存储的图像,并在图形窗口中显示它。如果我们想查看变量中的第 17 个图像PET(先前打开的研究的第 8 片中的第 17 帧),我们想查看PET(:,17),因为这将返回矩阵 PET 的第 17 列的所有元素

viewimage(PET(:,17));

这将产生类似于这样的图像

文件:MINC emma1PET.png

创建新的 MINC 文件

[编辑 | 编辑源代码]

我们也可以使用 EMMAnewimage函数创建一个新的 MINC 文件并将图像写入其中。如果我们要保存变量PET到名为new.mnc的新的 MINC 文件中,我们首先会使用newimage函数创建 MINC 文件

 h2 = newimage('new.mnc', [21 1 128 128]);

openimage函数类似,newimage也返回一个打开的 MINC 文件的句柄(这次 MINC 文件是打开以供写入)。上面的命令创建一个包含 21 帧、1 片和 128x128 图像的 MINC 文件。当使用newimage创建文件时,它是空的,应该用图像填充。这可以使用 EMMAputimages函数创建 MINC 文件

putimages(h2,PET,1,1:21);

函数完成。这将变量 PET 中的 21 个图像写入 MINC 文件(由h2表示)作为第 1 片,帧 1 到 21。

更复杂的示例

[编辑 | 编辑源代码]

让我们尝试一些更复杂的东西。我们将使用我们已经从磁盘读取的变量PET,将每个像素在帧(时间)上进行积分,并将生成的图像写出。首先,我们需要加载的 21 帧的中帧时间。我们可以使用 EMMAgetimageinfo函数获取此信息

ftimes = getimageinfo(h,'MidFrameTimes');

这将创建一个名为ftimes的新变量,其中包含每一帧的中帧时间。我们现在可以使用 EMMAntrapz函数(它与 MATLABtrapz函数具有相同的功能,但执行其计算的速度快一个数量级)进行积分

img = ntrapz(ftimes,PET')';

我们必须将PET变量转置后再传递给ntrapz函数,因为ntrapz期望第二个变量的行数与第一个变量的行数相同(PET为 16384x21,因此PET'为 21x16384,而ftimes为 21x1,满足要求)。答案也必须转置,以便img成为图像的列向量(而不是行向量)表示。(注意:此示例不是计算积分图像的最内存高效的方式。有关更多信息,请参阅 [matlab_memory.html 控制 MATLAB 内存使用]。)

人们可能会想象这样一种情况,我们希望计算研究中每一片的积分图像,然后将结果写入新的 MINC 文件。我们希望新的 MINC 文件具有与原始 MINC 文件相同的维信息,只是没有帧。这很容易实现,因为 newimage 允许指定一个“父图像”,从中获取所需的维信息。因此,使用原始 MINC 文件作为父文件,我们可以创建一个新的 MINC 文件

h3 = newimage('new2.mnc', [0 15], ...
     '/local/matlab/toolbox/emma/examples/yates_19445.mnc');

这个新文件不包含帧,包含 15 片,并且与父图像具有相同的间距。然后,我们可以使用putimages函数创建 MINC 文件

putimages(h3,img,8);

函数将我们的积分图像写入这个新的 MINC 文件中。img这将变量中的数据写入句柄h3

所表示的 MINC 文件中,作为第 8 片(请记住,我们最初是从第 8 片读取数据的)。为了将每个片的数据写入新的 MINC 文件,我们需要对每个片重复上述过程(读取、积分、写入结果)。
华夏公益教科书