Main Content

导入图像

要将图形文件中的数据导入到 MATLAB® 工作区,请使用 imread 函数。使用此函数可以从许多具有标准文件格式的文件中导入数据,这些文件格式包括:标记图像文件格式 (TIFF)、图形交换格式 (GIF)、联合图像专家组 (JPEG) 和可移植网络图形 (PNG) 格式。关于所支持格式的完整列表,请参阅 imread 参考页。

例如,将 JPEG 格式的文件中存储的图像数据以数组 I 的形式读取到 MATLAB 工作区。

I = imread("ngc6543a.jpg");

imread 将工作区中的图像表示为 uint8 类的多维数组。数组的维度取决于数据的格式。例如,imread 使用三个维度表示 RGB 颜色图像。

whos I
  Name        Size                 Bytes  Class    Attributes

  I         650x600x3            1170000  uint8              

要更大程度地控制 TIFF 文件的读取,请使用 Tiff 对象。有关详细信息,请参阅从 TIFF 文件中读取图像数据和元数据

获取有关图像文件的信息

如果有标准图形格式的文件,可使用 imfinfo 函数获取有关其内容的信息。imfinfo 函数返回包含有关该文件的信息的一个结构体。结构体中的字段根据文件格式的不同而不同,imfinfo 始终返回一些基本信息,包括文件名、上次修改日期、文件大小和格式。

例如,获取联合图像专家组 (JPEG) 格式的文件的相关信息。

info = imfinfo("ngc6543a.jpg")
info = 

           Filename: 'current_directory\ngc6543a.jpg'
        FileModDate: '01-Oct-1996 16:19:44'
           FileSize: 27387
             Format: 'jpg'
      FormatVersion: ''
              Width: 600
             Height: 650
           BitDepth: 24
          ColorType: 'truecolor'
    FormatSignature: ''
    NumberOfSamples: 3
       CodingMethod: 'Huffman'
      CodingProcess: 'Sequential'
            Comment: {'CREATOR: XV Version 3.00b  Rev: 6/15/94  Quality = 75, Smoothing = 0↵'}

从 TIFF 文件中读取图像数据和元数据

虽然可以使用 imread 从 TIFF 文件中导入图像数据和元数据,但该函数有一些局限性。例如,TIFF 文件可以包含多个图像,并且每个图像可以有多个子图像。虽然可以使用 imread 从多图像 TIFF 文件中读取所有图像,但无法访问子图像。使用 Tiff 对象可以从 TIFF 文件中读取图像数据、元数据和子图像。构造的 Tiff 对象表示与 TIFF 文件的连接,并提供对 LibTIFF 库中的众多例程的访问。

此示例分步演示如何使用 Tiff 对象方法和属性从 TIFF 文件中读取子图像。为充分利用 Tiff 对象,您必须熟悉 TIFF 规范和技术说明。请访问 LibTIFF - TIFF 库和实用工具查看此文档。

从 TIFF 文件中读取子图像

TIFF 文件可以包含一个或多个图像文件目录 (IFD)。每个 IFD 都包含与图像关联的图像数据和元数据(标记)。每个 IFD 可以包含一个或多个 subIFD,后者也可以包含图像数据和元数据。这些子图像通常是包含 subIFD 的 IFD 中图像数据的降分辨率版本(缩略图)。

要读取 IFD 中的子图像,必须从 SubIFD 标记中获取子图像的位置。SubIFD 标记包含由指向子图像的字节偏移量构成的数组。然后,可以将 subIFD 的地址传递到 setSubDirectory 方法以将该 subIFD 设置为当前 IFD。大多数 Tiff 对象方法作用于当前 IFD。

使用 Tiff 对象构造函数打开包含图像和子图像的 TIFF 文件。以下示例使用在 创建 TIFF 子目录 中创建的 TIFF 文件,该文件包含一个具有两个 subIFD 的 IFD 目录。Tiff 构造函数打开该 TIFF 文件,并将文件中的第一个 subIFD 设置为当前 IFD。

t = Tiff("my_subimage_file.tif","r");

检索与当前 IFD 关联的 subIFD 的位置。使用 getTag 方法获取 SubIFD 标记的值。此方法将返回指定 subIFD 位置的字节偏移量数组。

offsets = getTag(t,"SubIFD");

导航到第一个子图像。

首先,将当前 IFD 设为包含第一个子图像的目录。

dirNum = 1; 
setDirectory(t,dirNum)

然后,使用 setSubDirectory 方法导航到第一个 subIFD。指定该 subIFD 的字节偏移量作为参数。此调用会将该 subIFD 设置为当前 IFD。

setSubDirectory(t,offsets(1))

采用与读取文件中的任何其他 IFD 一样的方式,读取当前 IFD(第一个 subIFD)中的图像数据。

subimage_one = read(t);

查看第一个子图像。

imagesc(subimage_one)

Figure contains an axes object. The axes object contains an object of type image.

导航到第二个子图像。

首先,将当前 IFD 重置为包含第二个子图像的目录。

setDirectory(t,dirNum)

然后使用 setSubDirectory 方法导航到第二个 subIFD。指定第二个 subIFD 的字节偏移量。

setSubDirectory(t,offsets(2))

采用与读取文件中的任何其他 IFD 一样的方式,读取当前 IFD(第二个 subIFD)中的图像数据。

subimage_two = read(t);

查看第二个子图像。

imagesc(subimage_two)

Figure contains an axes object. The axes object contains an object of type image.

关闭 Tiff 对象。

close(t)

另请参阅

相关主题