数字图像的分类,会涉及到一些主要的图像类型,本文就来介绍这些主要的图像类型在MATLAB中是如何存储和表示的,主要包括亮度图像、RGB图像、索引图像、二值图像和多帧图像。
亮度图像即灰度图像。MATLAB使用二维矩阵存储亮度图像,矩阵中的每个元素直接表示一个像素的亮度(灰度)信息。例如,一个200×300像素的图像被存储为一个200行300列的矩阵,可以使用小节介绍的选取矩阵元素(或子块)的方式来选择图像中的一个像素或一个区域。
如果矩阵元素的类型是双精度的,则元素的取值范围是从0到1;如果是8位无符号整数,则取值范围从0到255。数据0表示黑色,而1(或255)表示最大亮度(通常为白色)。
图1所示是一个使用双精度矩阵存储亮度图像的例子。
图1 MATLAB中亮度图像的表示方法
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位无符号整数数组存储。图2所示是一个使用双精度数组存储RGB图像的例子。
图2 MATLAB中RGB图像的表示方式
索引图像往往包含两个数组,一个图像数据矩阵(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级灰度)。图3中,数据矩阵使用的是双精度类型,所以没有偏移量,数据5表示颜色表中的第5种颜色。
图3 MATLAB中索引图像的表示方法
在二值图像中,像素的颜色只有两种可能取值:黑或白。MATLAB将二值图像存储为一个二维矩阵,每个元素的取值只有0和1两种情况,0表示黑色,而1表示白色。
二值图像可以被看作是一种特殊的只存在黑和白两种颜色的亮度图像,当然,也可以将二值图像看作是颜色索引表中只存在两种颜色(黑和白)的索引图像。
MATLAB中使用uint8型的逻辑数组存储二值图像,通过一个逻辑标志表示数据有效范围是0到1,而如果逻辑标志未被置位,则有效范围为0到255。
二值图像的表示方法如图4所示。
对于某些应用,可能要处理多幅按时间或视角方式连续排列的图像,称之为多帧图像(所谓“帧”就是影像动画中最小单位的单幅影像画面)。例如核磁共振成像数据或视频片断。Matlab提供了在同一个矩阵中存储多帧图像的方法,实际上就是在图像矩阵中增加一个维度来代表时间或视角信息。例如,一个拥有5张连续的400×300像素的RGB图像的多帧连续片断的存储方式是一个400×300×3×5的矩阵,一组同样大小的灰度图像则可以使用一个400×300×1×5的矩阵来存储。
如果多帧图像使用索引图像的方式存储,只有图像数据矩阵被按多帧形式存储,而颜色索引表只能公用。因此,在多帧索引图像中,所有的索引图像公用一个颜色索引表,进而只能使用相同的颜色组合。
图4MATLAB中二值图像的表示方法
◆ 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大致类似。
本文节选自《数字图像处理与机器视觉——Visual C++与Matlab实现(第2版)》
内容简介
图像处理与机器视觉是当今计算机科学中的一个热门研究方向,应用广泛,发展前景乐观。近年来,伴随着人工智能、模式识别学科以及人机智能接口技术的飞速发展,机器视觉的研究正在不断升温——从日常生活中与人类息息相关的光学字符识别(OCR)和汽车自动驾驶,到医学应用中的病灶检测与分析,再到未来人机智能交互领域中的人脸识别、情感计算等,图像处理作为机器视觉研究中必不可少的图像预处理环节是读者需要掌握的首要技术。和图像相关的东西往往容易引起计算机初学者的兴趣,笔者在读本科的时候就觉得能让计算机理解所“看”到的东西是一件非常神秘和令人兴奋的事情;但同时它的理论性较强,门槛较高,在各个高校中,这门课程大多也是作为计算机专业研究生的选修课程。要理解该领域的知识,读者需要具有一定的数学基础,除此之外还涉及信号处理、统计分析、模式识别和机器学习等专业领域知识,因此令很多人望而却步。
其实“难以理解”的关键在于缺乏必要的先序知识,造成了读者在相关知识上难以跨越的鸿沟。在撰写本书过程中,对于可能造成读者理解困难的地方,均尽可能地给出了必要的基本知识,深入浅出,尽量定性地去描述,对于那些并不一目了然的结论均给出了思路和解释,必要的还提供了证明,对于某些非常专业已经超过本书讨论范围的相关知识在最后给出了参考文献,供有兴趣的读者进一步学习和研究。
本书的宗旨是在向读者介绍知识的同时,培养读者的思维方法,使读者知其然还要知其所以然,并在解决实际问题中能有自己的想法。