本节书摘来自异步社区出版社《Visual C++ 2012 开发权威指南》一书中的第2章,第2.2节,作者: 张铮 , 徐超 , 任淑霞 , 韩海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.2 MATLAB图像类型及其存储方式
数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)
在小节介绍数字图像的分类时,曾接触到一些主要的图像类型。本节就来看一看这些主要的图像类型在MATLAB中是如何存储和表示的,主要包括亮度图像、RGB图像、索引图像、二值图像和多帧图像。
1.亮度图像(Intensity Image)
亮度图像即灰度图像。MATLAB使用二维矩阵存储亮度图像,矩阵中的每个元素直接表示一个像素的亮度(灰度)信息。例如,一个200×300像素的图像被存储为一个200行300列的矩阵,可以使用小节介绍的选取矩阵元素(或子块)的方式来选择图像中的一个像素或一个区域。
如果矩阵元素的类型是双精度的,则元素的取值范围是从0到1;如果是8位无符号整数,则取值范围从0到255。数据0表示黑色,而1(或255)表示最大亮度(通常为白色)。
图1.8所示是一个使用双精度矩阵存储亮度图像的例子。
图1.8 MATLAB中亮度图像的表示方法
2.RGB图像(RGB Image)
RGB图像使用3个一组的数据表达每个像素的颜色,即其中的红色、绿色和蓝色分量。在MATLAB中,RGB图像被存储在一个m×n×3的三维数组中。对于图像中的每个像素,存储的3个颜色分量合成像素的最终颜色。例如,RGB图像I中位置在11行40列的像素的RGB值为I(11,40,1:3)或I(11,40,:),该像素的红色分量为I(11,40,1),蓝色分量为I(11,40,3)。而I(:,:,1)则表示整个的红色分量图像。
RGB图像同样可以由双精度数组或8位无符号整数数组存储。图1.9所示是一个使用双精度数组存储RGB图像的例子。
图1.9 MATLAB中RGB图像的表示方式
3.索引图像(Indexed Image)
索引图像往往包含两个数组,一个图像数据矩阵(Image Matrix)和一个颜色索引表(Colormap)。对应于图像中的每一个像素,图像数据数组都包含一个指向颜色索引表的索引值。
颜色索引表是一个m×3的双精度型矩阵,每一行指定一种颜色的3个RGB分量,即color = [R G B]。其中R、G、B是实数类型的双精度数,取值0~1。0表示全黑,1表示最大亮度。图1.10给出一个索引图像的实例,注意图像中的每个像素都用整数表示,其含义为颜色索引表中对应颜色的索引。
图像数据矩阵和颜色索引表的关系取决于图像数据矩阵中存储的数据类型是双精度类型还是8位无符号整数。
如果图像数据使用双精度类型存储,像素数据1表示颜色索引表中的第一行,像素数据2表示颜色索引表中的第二行,依此类推。而如果图像数据使用8位无符号整数存储,则存在一个额外的偏移量-1,像素数据0表示颜色索引表中的第一行,而1表示索引表中的第二行,以此类推。
8位方式存储的图像可以支持256种颜色(或256级灰度)。图1.10中,数据矩阵使用的是双精度类型,所以没有偏移量,数据5表示颜色表中的第5种颜色。
图1.10 MATLAB中索引图像的表示方法
4.二值图像(Binary Image)
在二值图像中,像素的颜色只有两种可能取值:黑或白。MATLAB将二值图像存储为一个二维矩阵,每个元素的取值只有0和1两种情况,0表示黑色,而1表示白色。
二值图像可以被看作是一种特殊的只存在黑和白两种颜色的亮度图像,当然,也可以将二值图像看作是颜色索引表中只存在两种颜色(黑和白)的索引图像。
MATLAB中使用uint8型的逻辑数组存储二值图像,通过一个逻辑标志表示数据有效范围是0到1,而如果逻辑标志未被置位,则有效范围为0到255。
二值图像的表示方法如图1.11所示。
5.多帧图像(Multiframe Image Array)
对于某些应用,可能要处理多幅按时间或视角方式连续排列的图像,称之为多帧图像(所谓“帧”就是影像动画中最小单位的单幅影像画面)。例如核磁共振成像数据或视频片断。Matlab提供了在同一个矩阵中存储多帧图像的方法,实际上就是在图像矩阵中增加一个维度来代表时间或视角信息。例如,一个拥有5张连续的400×300像素的RGB图像的多帧连续片断的存储方式是一个400×300×3×5的矩阵,一组同样大小的灰度图像则可以使用一个400×300×1×5的矩阵来存储。
如果多帧图像使用索引图像的方式存储,只有图像数据矩阵被按多帧形式存储,而颜色索引表只能公用。因此,在多帧索引图像中,所有的索引图像公用一个颜色索引表,进而只能使用相同的颜色组合。
图1.11 MATLAB中二值图像的表示方法
◆ cat函数
cat函数可以在指定维度上连接数组,其调用方式如下。
CAT(DIM, A, B);
或
CAT(DIM, A1, A2, …);
此函数在第DIM维度将第2至第n个参数提供的数组连接起来。于是,若要构造一个由5幅RGB图像构成的多帧图像组,使用的命令如下。
ANIM=CAT(4, A1, A2, A3, A4, A5);
◆ 选择存储方式时的限制
图像处理工具箱中的某些函数只能处理图像矩阵中的前2维或前3维信息。当然,也可以使用它们处理拥有4个维度或5个维度的RGB图像或者连续图像序列,但这需要单独处理每帧符合要求的亮度/二值/索引/RGB图像。例如,显示ANIM中的第3帧图像需要使用如下方式。
imshow(ANIM(:,:,:,3));
函数imshow的作用是显示一帧图像,
注意 如果向一个函数传递了超过其所能够处理的维度的图像矩阵,那么结果可能是不确定的。某些函数的行为可能是处理图像的第一帧或第一个颜色维度,但某些函数可能带来不确定的行为和处理结果。
默认情况下,MATLAB将绝大多数数据存储为双精度类型(64位浮点数)以保证运算的精确性。而对于图像而言,这种数据类型在图像尺寸较大时可能并不理想。例如,一张1000像素见方的图像拥有100万个像素,如果每个像素用64位二进制数表示,总共需要大约8MB的内存空间。
为了减小图像信息的空间开销,可以将图像信息存为8位无符号整型数(uint8)或16位无符号整型数(uint16)的数组,这样只需要双精度浮点数1/8或1/4的空间。在上述3种存储类型中以双精度和uint8使用最多,uint16的情况与uint8大致类似。