目的
1.熟悉图像的四种类型。
2.熟练掌握图像的读、写操作以及显示方法。
3. 熟悉图像的类型转换以及格式转换。
1. 图像的表示以及数字化
广义的图像是指视觉信息。举凡照片、图画、电视画面以及由透镜、光栅及全息
图所构成的光学成像等均属之。我们观察一幅单色静止图像,其亮度的明暗变化就构成图像视觉。所以,一幅单色(monochrome)静止的图像可以表示为强度或亮度的二维分布
,其中F代表图像亮度或者强度,(x,y)是二维平面点坐标。对于黑白图像,通常用不同的灰度级来表示其亮度的差异;对于彩色图像,可以视为由单个单色的二维图像组合形成的。例如,在RGB彩色系统中,一幅彩色图像是由三幅独立的分量图像(红、绿、蓝)按不同的比例组成的。因此,许多为黑白图像处理开发的技术适用于彩色图像处理,方法是分别处理三副独立的分量图像即可。此时,每一幅分量图像只有亮度的二维分布,如图1所示。
通常我们看到的图像是一幅亮度在空间连续变化的模拟图像(即图像关于亮度F以及空间坐标x,y连续)。例如在显微镜下看到的就是一副光学模拟图像。连续的模拟图像经过离散化处理后变成计算机能够识别的点阵图像,称为数字图像。把模拟图像转换成数字图像其实就是数字化 (即离散化)图像亮度F以及空间坐标x,y。将坐标数字化称为取样;将亮度数字化称为量化。采样和量化的过程如图2所示。二维图像平面经过数字化后,变成一个个方形的像素(pixel),亮度数字化之后变成一个二维的数值矩阵。所以一副数字图像对应于一个数值矩阵,该矩阵通常称为图像的数据矩阵。图像数据矩阵的大小即是图像像素的数目,矩阵的行与列决定一个像素点,矩阵元素值(也称像素值)反映该像素点的灰度。例如图2右边所示的图像数据矩阵为8×8的二维矩阵,那么该数字图像包含8×8=64个像素,第一行第一列代表第一个像素,其像素值(元素值)1表达该像素的灰度。
由于数字图像和数值矩阵之间有着十分自然的对应关系,所以MATLAB非常适合用来处理数字图像。
图2 图像的采样和量化
2. 图像的类型
MATLAB采用4种不同的方式把图像数据矩阵中的元素值(又称像素值)解释为对应像素的颜色:
(1) 强度图像(Intensity images)
也称灰度图像(grayscale)。一幅强度图像就是一个数据矩阵,矩阵的每个元素对应一个图像像素,元素值(像素值)代表像素的亮度或者灰度级。像素值的数据类型可以是uint8或uint16或者double型。如果是uint8或uint16,则像素值的范围分别是[0,255]和[0,65536],其中0代表黑色(亮度最低或灰度级最低),255或者65536代表白色(亮度最高或者灰度级最高),其他整数介于两者之间;若像素值是double类,系统规定双精度型像素值的取值范围是[0,1],0代表黑色,1代表白色,其余介于两者之间。例如图2中的数据矩阵,如果该图是强度图像,则第一个像素值1代表该像素的亮度是仅次于黑色的灰度级,余者类推。
(2) 二值图像(Binary images)
对于一幅二值图像,其数据矩阵中像素值的取值只有0和1两个逻辑数,分别代表黑色和白色,所以二值图像只有黑色和白色两种颜色。下图描绘了一幅二值图像。
(3) 索引图像(Indexed images)
在强度图像和二值图像中,数据矩阵中的像素值直接代表像素的亮度(即颜色),而索引图像的像素值则并不直接代表颜色,而是把像素值按照一定的规则映射到颜色表(colormap)或者调色板中的某一个颜色。所以索引图像也叫映射图像,一幅索引图像包含一个图像数据矩阵和一个预先定义的色图(Colormap)矩阵。色图矩阵是一个m×3的double型数组,矩阵的元素值介于[0 1]之间。色图矩阵的每一行代表一种彩色,它是个3元行数组,分别代表R分量(红色分量)、G分量(绿色分量)、B分量(蓝色分量)的比例,例如(0 0 1)代表蓝色,(1 1 1)代表白色等。色图矩阵的列数m代表颜色的种类。图像数据矩阵的类型可以是uint8或uint16或者double型。对于uint8或uint16类型,像素值0映射到色图矩阵(即颜色表)的第一行,表示该像素使用颜色表的第一个颜色绘制,像素值1映射到色图矩阵的第二行,类此类推,可见uint8或uint16型的像素值和颜色种类之间有一个偏差1。对于数据矩阵是double型的,像素值1映射到色图矩阵的第一行,2映射到第二行,以此类推。由上可见,索引图像数据矩阵的像素值也就是对颜色表的索引值(Index)。
注意,索引图像的颜色都是预先定义的,并且可供选用的一组颜色也很有限,索引颜色的图像最多只能显示256种颜色。当读入索引图像文件时,必须同时读入其数据矩阵和色图矩阵,即绘图用的颜色表。图4所示代表一幅索引图像,其数据矩阵是double类型。
(4) RGB图像(RGB images)
RGB图像也称真彩色图像。其图像数据矩阵是一个m×n×3数组,数组中的元素值定义了相应像素的红(R)、绿(G)、蓝(B)颜色分量,其中沿第3维(即“页”维)方向的第一页
代表像素的R颜色分量,第二页是G分量,第三页是B分量。所以RGB图像不需要色图
矩阵或颜色表,每个像素点的颜色由其R、G、B分量直接指定。例如,像素点(10,5)的红、绿、蓝分量分别储存在数据矩阵的(10,5,1)、(10,5,2)、(10,5,3)三个元素中。数据矩阵的类型有double、uint8或uint16。对于double型,每个颜色分量介于0和1之间,如果像素的颜色分量是(0 0 0),则是黑色像素,(1 1 1)是白色像素。图5显示一幅RGB图像的数据矩阵。
图5 RGB图像的数据矩阵及其三个颜色分量,第1个平面(即第1“页”)为R分量,
第2个平面是G分量,第3个是B分量。
2. 图像的读、写与图像信息查询
Matlab为用户提供了特殊的函数用于从图像格式文件中读写图像数据。其中读取图像格式文件的函数是imread,写入图像格式文件的函数是imwrite,查询图像信息的函数是imfinfo。下面分别介绍它们的用法。
(1) imread
[X,MAP]=imread(’filename’,’fmt’)
其中,X,MAP分别为读出的图像数据和颜色表数据(色图矩阵),fmt为图像的格式,如bmp、jpg、png、tif、gif格式等,filename为读取的图像文件(可以加上文件的路径)。
例: [X,MAP]=imread(’flowers.tif’, ’tif’);
或者 [X,MAP]=imread(’flowers.tif’);
如果读取的是RGB图像或者强度图像,色图矩阵一般为空,即MAP=[]。
(2) imwrite
imwrite函数用于输出图像,其语法格式为:
imwrite(X, MAP, ’filename’, ’fmt’)
按照fmt指定的格式将图像数据矩阵X和颜色表MAP写入文件filename。
(3) imfinfo
imfinfo函数用于读取图像文件的有关信息,其语法格式为
imfinfo(’filename’, ’fmt’)
imfinfo函数返回一个结构体,该结构体包含图像的各方面信息,其主要数据:文件名(路径)、文件格式、文件格式版本号、文件的修改时间、文件的大小、文件的长度、文件的宽度、每个像素的位数、图像的类型等。
例:imfinfo('rice.png'); % 注意查看图像类型和颜色表
3. MATLAB中图像文件的显示
MATLAB图像处理工具箱提供了imshow函数来显示各种图像,其语法如下:
imshow(I, n)
或 imshow(BW); imshow(X, MAP); imshow(RGB)
其中imshow(I, n)用于显示强度(灰度)图像,I是图像数据矩阵,n为灰度级数目,缺省值为256。其它的分别用于显示二值图像、索引色图像和RGB真彩色图像。另外,对RGB彩色图像,还可以用imshow( RGB(:, :, 1) )、imshow( RGB(:, :, 2) )、imshow( RGB(:, :, 3) )分别显示RGB图像的R、G、B三个分量(这里RGB代表图像数据矩阵),但是注意,这样显示出的图像是各分量所对应的灰度图像,见图1所示。
4. 图像类型转换
用imfinfo函数读取图像文件的有关信息可以确定图像的类型。图像类型之间的转换有时非常有用。下表是MATLAB提供的部分图像类型转换函数:
函 数 | 功 能 |
gray2ind | 根据一幅灰度图像创建索引图像 |
im2bw | 用阈值截取法将灰度图像、索引图像或RGB图像转换为二值图像 |
ind2gray | 根据一幅索引图像创建一幅灰度图像 |
ind2rgb | 根据一幅索引图像创建一幅RGB图像 |
rgb2gray | 根据一幅RGB图像创建一幅灰度图像 |
rgb2ind | 根据一幅RGB图像创建一幅索引图像 |
上表中函数有类似的调用格式:函数的输入参数是图像数据矩阵(如果是索引图像,那么输入参数还包括颜色表),返回值是转换后的函数(包括索引函数的调色板),只有函数im2bw的调用格式不同,其输入参数中还包括一个截取阈值LEVEL,超过此阈值的像素被截取为1否则为0。如:
[X, MAP]=imread('trees.tif');
X0=im2bw(X,0.4); % 将RGB图像转换为二值图像(黑白图像),截取阈值=0.4
5、图像文件格式的转换
图像文件格式之间的转换,可以间接利用图像读写函数来完成;首先使用imread函数按照原有的图像格式进行图像读取,然后调用imwrite函数对图像进行保存,并指定图像的保存格式。如将BMP格式转换为PNG格式:
bitmap=imread(’mybitmap.bmp’, ’bmp’)
imwrite(bitmap, ’mybitmap.png’, ’png’)
1.利用imread( )函数分别读取下列四副图像:peppers.png、pout.tif、forest.tif、circles.png(注:Matlab安装目录下\toolbox\images \imdemos文件夹里,系统附带了各种类型的图片),判断它们各属于哪种类型的图像,并回答思考题1。
2.读取一幅RGB图片,并将它转换成其他几种图像类型(通过帮助系统自学相应转换函数的具体用法);
3. 读取一幅TIF格式的图像,将它转换成JPG文件格式,并尝试使用不同的压缩品质(使用help imwrite 查询其‘quality’参数的用法)压缩文件,比较压缩前后文件的大小和图像质量。
4.读取一幅索引图像,将图像显示出来。尝试修改MAP颜色矩阵的值,再将图像显示出来,对比观察图像颜色的变化。