Main Content

读取、写入和查询图像文件

使用图像格式

从本质上说,图形文件格式图像并非以 MATLAB® 矩阵的形式存储,甚至不必以矩阵的形式存储。大多数图形文件都以包含特定格式信息标签的标头开头,然后是能够以连续流方式读取的位图数据。因此,不能使用标准的 MATLAB I/O 命令 loadsave 来读取和写入图形文件格式图像。

调用专门的 MATLAB 函数从图形文件格式读取和写入图像数据:

  • 要读取图形文件格式图像,请使用 imread

  • 要写入图形文件格式图像,请使用 imwrite

  • 要获取有关图形文件图像的性质信息,请使用 imfinfo

下表更加清楚地阐明了具体的 MATLAB 命令所该采用的具体的图像类型。

过程

要使用的函数

以 MAT 文件的形式加载或保存矩阵。

load

save

加载或保存图形文件格式图像,如 BMP、TIFF。

imread

imwrite

显示加载到 MATLAB 工作区的任何图像。

image

imagesc

实用工具

imfinfo

ind2rgb

读取图形图像

imread 函数能够按照任意受支持的位深读取任意受支持的图形文件中的图像。所读取的大多数图像均为 8 位。将这些图像读入内存后,以 uint8 类的形式来存储这些图像。这一规则的主要例外是 MATLAB 支持 16 位数据的 PNG 和 TIFF 图像;如果您读取 16 位的 PNG 或 TIFF 图像,那么该图像以 uint16 类的形式保存。

注意

对于索引图像,imread 始终将颜色图读入 double 类的数组,即使图像数组本身可能属于 uint8uint16 类,也是如此。

以下命令可将图像 ngc6543a.jpg 读入工作区变量 RGB,然后用 image 函数来显示该图像:

RGB = imread('ngc6543a.jpg');
image(RGB)

您可以使用 imwrite 函数写入(保存)图像数据。以下语句

load clown % An image that is included with MATLAB
imwrite(X,map,'clown.bmp')

可用于创建包含 clown 图像的 BMP 文件。

写入图形图像

当您使用 imwrite 保存图像时,默认的行为是自动将位深减小为 uint8。MATLAB 中所使用的图像大多数为 8 位,而且大多数图形文件格式图像不需要双精度数据。对于以 uint8 形式保存图像数据的规则而言,PNG 和 TIFF 图像是例外的,它们可保存为 uint16。因为这两种格式支持 16 位数据,所以您可以通过将 uint16 指定为 imwrite 的数据类型以覆盖 MATLAB 的默认行为。以下示例说明了使用 imwrite 写入 16 位 PNG 文件的方式。

imwrite(I,'clown.png','BitDepth',16);

划分图形图像的分集(裁剪)

有时候您只想使用图像文件的一部分或要将其划分成几个子区域。在命令行中,指定您想要使用的矩形子区域的内部坐标,并将它保存到文件中。如果您不知道子区域的各边角点的坐标,则以交互的方式进行选择,正如以下示例所示:

% Read RGB image from graphics file. 
im = imread('street2.jpg'); 

% Display image with true aspect ratio
image(im); axis image

% Use ginput to select corner points of a rectangular
% region by pointing and clicking the mouse twice
p = ginput(2); 

% Get the x and y corner coordinates as integers
sp(1) = min(floor(p(1)), floor(p(2))); %xmin
sp(2) = min(floor(p(3)), floor(p(4))); %ymin
sp(3) = max(ceil(p(1)), ceil(p(2)));   %xmax
sp(4) = max(ceil(p(3)), ceil(p(4)));   %ymax

% Index into the original image to create the new image
MM = im(sp(2):sp(4), sp(1): sp(3),:);

% Display the subsetted image with appropriate axis ratio
figure; image(MM); axis image

% Write image to graphics file. 
imwrite(MM,'street2_cropped.tif') 

如果您知道图像边角点的坐标,那么在上例中,您可以手动定义 sp 而不必使用 ginput

您还可以在对图像执行交互操作时,显示一个“橡皮筋框”以划分图像的子集。有关详细信息,请参阅 rbbox 代码示例。有关详细信息,请参阅 ginputimage 函数的文档。

获取有关图形文件的信息

imfinfo 函数可以让您获取先前列出的所有格式图形文件的相关信息。您所获取的信息取决于文件类型,但至少始终包含以下信息:

  • 文件名称,包括文件夹路径(如果文件不在当前文件夹中)

  • 文件格式

  • 文件格式的版本号

  • 文件修改日期

  • 文件大小(以字节为单位)

  • 图像宽度(以像素为单位)

  • 图像高度(以像素为单位)

  • 每像素位数

  • 图像类型:RGB(真彩色)、强度(灰度)或索引