导入图像
要将图形文件中的数据导入到 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)
导航到第二个子图像。
首先,将当前 IFD 重置为包含第二个子图像的目录。
setDirectory(t,dirNum)
然后使用 setSubDirectory
方法导航到第二个 subIFD。指定第二个 subIFD 的字节偏移量。
setSubDirectory(t,offsets(2))
采用与读取文件中的任何其他 IFD 一样的方式,读取当前 IFD(第二个 subIFD)中的图像数据。
subimage_two = read(t);
查看第二个子图像。
imagesc(subimage_two)
关闭 Tiff 对象。
close(t)