根据图像在计算机中表示形式的不同,形成了几种不同类型的图像,如RGB图像、灰度图像、索引图像、二值图像等。本节将分别介绍这4种图像类型,以及它们之间的相互转换。
2.4.1 图像类型
1.RGB图像
RGB图像,由Red、Green、Blue三种颜色分量组成。这三种颜色的组合可形成其他颜色,所以用它们来表示彩色图像。RGB图像也称真彩色图像,由3个维度相同的二维数组组成,每个数组分别代表图像颜色中红色的分量、绿色的分量和蓝色的分量。每个像素由24位组成,每8位代表一种颜色分量。通过函数imread读入一幅真彩色图像,返回的是一个M×N×3的三维数组。
2.灰度图像
灰度图像的像素值都在[0,255],一幅灰度图像由一个二维矩阵表示,像素值0表示黑色,像素值255表示白色。像素值为[1,254],则表示不同程度的灰色。
3.索引图像
索引图像由数据矩阵和调色板矩阵组成。调色板矩阵是一个M×3的数组,每一行代表一种颜色,每种颜色由Red、Green、Blue三种颜色分量组成,颜色分量值为[0,1]的浮点型数据。数据矩阵是一个二维矩阵,数据矩阵中的值指向调色板对应行的数据,如值1指向调色板矩阵的第一行,值5指向调色板矩阵的第五行。
数据矩阵和调色板矩阵存放在一起,通过函数imread读取一幅索引图像,会返回数据矩阵X和调色板矩阵map,格式如下。
[X,map]=imread(/'索引图像/');
4.二值图像
二值图像是由像素值0或1组成的一幅图像,像素值为0对应的图像为黑色,像素值为1对应的图像为白色。由于二值图像没有中间过度的灰色,因此只能表示文字或图像轮廓。二值图像占用的空间比较少。
2.4.2 图像类型的转换
在数字图像处理中,经常需要转换图像类型,在MATLAB中有一些函数可以实现图像类型之间的转换。
1.RGB图像转换为灰度图像
在MATLAB中,函数rgb2gray可以将RGB图像转换为灰度图像,格式如下。
gray =rgb2gray(A)
A为输入的RGB图像,gray是转换后输出的灰度图像。RGB图像的每个像素由3个颜色分量值表示,灰度图像每个像素只有一个值。分别将RGB图像中3个分量的值乘以某个比例再相加,即可得到对应的灰度图像的像素值。转换后宽、高不变,数值类型不变。
rgb2gray就是按照如下公式比例进行转换的。
gray1 = 0.29894 *A(:,:,1) + 0.58704 * A(:,:,2) + 0.11402 * A(:,: ,3);
注:上述公式只是为了说明转换过程,由于精度的原因,按照上述公式转换后的结果和使用函数rgb2gray转换后得到的结果会有误差,建议读者以后使用函数rgb2gray进行转换。
下面我们通过Code12说明如何利用函数rgb2gray和公式将RGB图转换为灰度图像。
Code12:ch2_12.m
运行Code12后,结果如图2-19所示。图(a)是原真彩色图像,图(b)是利用函数rgb2gray转换后得到的灰度图像,图(c)是利用公式转换后得到的灰度图像。
图2-19 Code12的运行结果
2.索引图像转换为灰度图像
在MATLAB中,函数ind2gray可以将索引图像转换为灰度图像,格式如下。
gray=ind2gray(X,map)
在索引图像转换为灰度图像的过程中,只保留索引图像的亮度,去除了颜色和饱和度。输入的索引图像数据类型无论是double还是uint8,转换后的灰度图像数据类型都是double。下面我们通过Code13来说明如何利用函数ind2gray进行索引图像到灰度图像的转换。
Code13:ch2_13.m
运行Code13后,结果如图2-20所示。
图2-20 Code13的运行结果
3.矩阵转换为灰度图像
在MATLAB中,一幅图像由一个数据矩阵表示,数据矩阵中每个数值都在限定的范围内。对于任意的一个矩阵,只要把矩阵中的数值转换为限定的取值范围内的数值,就可以把一个矩阵转换为一幅灰度图像。函数 mat2gray就可以将一个矩阵转换为一幅灰度图像,格式如下。
Gray=mat2gray(mat,[min,max]);
输入一个矩阵mat,矩阵中的数值小于min会被转换为0,即转换为黑点;大于max会被转换为1,即转换为白点;其他值转换为不同程度的灰度值。min和max可以选择性地进行设置,如果不设置,则默认min对应矩阵mat中的最小值,max对应矩阵mat中的最大值。下面我们通过Code14来说明如何利用函数mat2gray将矩阵转换为灰度图像。
Code14:ch2_14.m
运行Code14后,结果如图2-21所示,该图是一幅灰度图像。
图2-21 Code14的运行结果
4.索引图像转换为RGB图像
在MATLAB中,函数ind2rgb可以将索引图像转换为RGB图像,格式如下。
rgb=ind2rgb(X,map);
X和map分别是索引图像的数据矩阵和调色板矩阵,转换过程就是将每个像素在调色板中对应的序号的颜色赋值给一个三维数组。无论输入的索引图像的数据类型是uint8、uint16还是double,转换后RGB图像的数据类型都是double。下面我们通过Code15来说明如何利用函数ind2rgb将索引图像转换为RGB图像。
Code15:ch2_15.m
运行Code15后,结果如图2-22所示。图(a)是原索引图像,图(b)是通过函数ind2rgb转换后的RGB图像。
图2-22 Code15的运行结果
5.RGB图像转换为索引图像
上面介绍了函数ind2rgb可以将索引图像转换为RGB图像。在MATLAB中,也有类似的函数rgb2ind,可以将RGB图像转换为索引图像。函数rgb2ind有几种不同的转换方法,即均匀量化法、最小方差量化法和颜色表近似法,不同的转换方法调用函数rgb2ind的方法不同,格式如下。
均匀量化法:
[X,map]=rgb2ind(rgb,tol)
rgb是待转换的RGB图像,tol决定了转换后索引图像的调色板矩阵map中的颜色种类,调色板矩阵map包含的颜色种类至少有[floor(1/tol)+1]3种。
最小方差量化法:
[X,map]=rgb2ind(rgb,N)
N表示生成的索引图像的调色板矩阵map中至少有N中颜色。
颜色表近似法:
X=rgb2ind(rgb,map)
下面我们通过Code16来说明如何利用函数rgb2ind将RGB图像转换为索引图像。
Code16:ch2_16.m
运行Code16后,结果如图2-23所示。图(a)是原RGB图像,图(b)是均匀量化法转换后的索引图像,图(c)是最小方差量化法转换后的索引图像,图(d)是颜色表近似法转换后的索引图像。
图2-23 Code16的运行结果
6.灰度图像转换为索引图像
在MATLAB中,函数gray2ind可以将灰度图像转换为索引图像,格式如下。
[X,map]=gray2ind(gray,n)
n表示灰度级数,如果不设置,则默认为64。
下面我们通过Code17来说明如何利用函数gray2ind将灰度图像转换为索引图像。
Code17:ch2_17.m
运行Code17后,结果如图2-24所示。图(a)是原灰度图像,图(b)是默认灰度级转换后的索引图像,图(c)是灰度级为5转换后的索引图像。
图2-24 Code17的运行结果
7.各种类型的图像转换为二值图像
二值图像中数据的值都是1或0,将其他类型的图像矩阵转换为二值图像的主要工作是:确定哪些值转换为1,哪些值转换为0。通常我们设置一个阈值level,如果小于level的值转化为0,则其他都转换为1,这样就可以将其他类型的图像转换为对应的二值图像。在MATLAB中,函数im2bw可以将其他类型的图像转换为二值图像,但调用格式不同,具体如下。
灰度图像和RGB图像转换为二值图像,格式为:
BW=im2bw(img,level)
level的取值范围为(0,1)。若level=0.5,则所有小于255×0.5=127.5的值转换为0,其他值都转换为1。
如果img是RGB图像,调用函数im2bw,RGB图像首先会被直接转换为灰度图像,然后根据level值相应地转换为0或1。
索引图像转换为二值图像,格式为:
BW=im2bw(X,map,level)
Level的取值范围为[0,1]。如果输入的是索引图像的数据矩阵X和调色板矩阵map,那么首先它们会被转换为灰度图像,然后根据level值相应地转换为0或1。下面我们通过Code18来说明如何利用函数im2bw将各种类型的图像转换为二值图像。
Code18:ch2_18.m
运行Code18后,结果如图2-25所示,有三组图,分别为灰度图像、RGB图像和索引图像到二值图像的转换。
图2-25 Code18的运行结果
图2-25 Code18的运行结果(续)