2.4 读取和写入图像文件
Matlab可以处理以下的图像文件类型:BMP、HDF、JPEG、PCX、TIFF、XWD、ICO、GIF、CUR。可以使用imread和imwrite函数对图像文件进行读写操作,使用imfinfo函数来获得数字图像的相关信息。
1.imread函数
imread函数可以将指定位置的图像文件读入工作区。对于除索引图像以外的情况,其原型如下。
A = imread(FILENAME, FMT);
参数说明
● FILENAME 指定图像文件的完整路径和文件名。如果要读入的文件在当前工作目录中或者自动搜索列表中给出的路径下,则只需提供文件名。
● FMT 参数指定图像文件的格式所对应的标准扩展名,例如 GIF 等。如果 imread 没有找到FILENAME所指定的文件,它会尝试FILENAME.FMT。
返回值
● A是一个包含图像数据的矩阵。对于灰度图,它是一个m行n列的矩阵;对于RGB真彩图,则是一个m×n×3的矩阵。对于大多数图像文件,A的类型为uint8;而对于某些TIFF和PNG图像,A的类型为uint16。
对于索引图像,情况有所不同,此时IMREAD的调用形式如下。
[X, MAP] = imread(FILENAME, FMT);
此时的返回值中,X 为图像数据矩阵,MAP 则是颜色索引表。图像中的颜色索引数据会被归一化到0到1的范围内。因为,对于索引图像,不论图像文件本身使用何种数据类型,imread函数都会使用双精度类型存储图像数据。
imread函数还可以处理RGBA等格式存储的图像,可以通过在命令窗口中输入help imread来查看Matlab中有关imread的在线帮助信息。
2.IMWRITE函数
imwrite 将指定的图像数据写入文件中,通过指定不同的保存文件扩展名,可以起到图像格式转换的作用(参见例2.4)。其调用格式如下。
imwrite(A, FILENAME, FMT);
● FILENAME参数指定文件名(不必包含扩展名)。
● FMT参数指定保存文件所采用的格式。
存储索引图像时,还需要一并存储颜色索引表,则此时IMWRITE函数的使用方法应为如下所示。
imwrite(A, MAP, FILENAME, FMT);
MAP是合法的Matlab颜色索引表。
imwrite函数还可以控制图像文件的很多属性,如TIFF文件格式所选择的彩色空间、GIF格式中的透明色以及图像文件的作者、版权信息、解析度和创建软件等。
[例2.4]读入一幅tif图像文件,并在写入磁盘时将tif图像转换为bmp图像。
>>I=imread('pout.tif'); %读入图像
>>whos I %查看图像变量信息
Name Size Bytes Class
I 291x240 69840 uint8 array
Grand total is 69840 elements using 69840 bytes
%通过whos命令可以看到读入的高为291、宽为240的灰度图像I就是一个291*240的二维矩阵
>>imwrite(I, 'pout.bmp'); %将图像写入文件pout.bmp,同时起到了转换文件类型的作用
例2.4中的功能已经被封装在金羽图书论坛(http://bbs.book95.com)的“金羽图书与答疑”板块与本书同名的主题帖子附件中的“Chapter2/Code目录下的ex2_4.m”文件内。
3.imfinfo函数
imfinfo函数可以读取图像文件中的某些属性信息,例如修改日期、大小、格式、高度、宽度、色深、颜色空间、存储方式等。
imfinfo(FILENAME, FMT);
● FILENAME参数指定文件名。
● FMT参数是可选参数,指定文件格式。
[例2.5]查看图像文件信息。
>>imfinfo('pout.tjf') %查看图像文件信息
ans =
Filename: 'F:\Program Files\Matlab\R2011a\toolbox\images\imdemos\pout.
tif'
FileModDate: '04-十二月-2000 13:57:50'
FileSize: 69004
Format: 'tif'
FormatVersion: []
Width: 240
Height: 291
BitDepth: 8
ColorType: 'grayscale'
FormatSignature: [73 73 42 0]
ByteOrder: 'little-endian'
NewSubFileType: 0
BitsPerSample: 8
Compression: 'PackBits'
PhotometricInterpretation: 'BlackIsZero'
StripOffsets: [9x1 double]
SamplesPerPixel: 1
RowsPerStrip: 34
StripByteCounts: [9x1 double]
XResolution: 72
YResolution: 72
ResolutionUnit: 'None'
Colormap: []
PlanarConfiguration: 'Chunky'
TileWidth: []
TileLength: []
TileOffsets: []
TileByteCounts: []
Orientation: 1
FillOrder: 1
GrayResponseUnit: 0.0100
MaxSampleValue: 255
MinSampleValue: 0
Thresholding: 1
Offset: 68754