图像的文件格式
要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机 进行处理以前,首先要数字化,比如摄像头(CCD)摄取的信号在送往计算机处理前,一般情况下要经过数模转换,这个任务常常由图像采集卡完成,它的输出一 般为裸图的形式;如果用户想要生成目标图像文件,必须根据文件的格式做相应的处理。随着科技的发展,数码相机,数码摄像机已经进入寻常百姓家,我们可以利 用这些设备作为图像处理系统的输入设备为来后续的图像处理提供信息源。无论是什么设备,它总是提供按一的图像文件格式来提供信息,比较常用的有BMP格 式,JPEG格式,GIF格式等等,所以我们在进行图像处理以前,首先要对图像的格式要有清晰的认识,只有在此基础上才可以进行进一步的开发处理。
在讲述图像文件格式前,先对图像作一个简单的分类。除了最简单的图像外,所有力像都有颜色,而单色图像则是带有颜色的图像中比较简单的格式,它 一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像,我们也可 以用8个比特(一个字节)表示一个像素,相当于把黑和白等分为256个级别,“0”表示为黑,“255”表示为白,该字节的数值表示相应像素值的灰度值或 亮度值,数值越接近“0”对应像素点越黑,相反,对应像素点越白,此种图像我们一般称之为灰度图像,色图像和灰度图像又统称为黑白图像,与之对应存在着彩 色图像,这种图像要复杂一些,表示图像时,常用的图像彩色模式有RGB模式,CMYK模式和HIS模式,一般情况下我们只使用RGB模式,R对应红色,G 对应绿色,B对庆蓝色,它们统称为三基色,这三种色彩的不同氨基酸,就可以氨基酸成各种现实中的色彩,此时彩色图像的每一个像素都需要3个样本组成的一组 数据表示,其中每个样本用于表示该像素的一个基本颜色。
对于现存的所有的图像文件格式,我们主要说BMP图像文件格式,并且文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进 行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的文件最适合我们对之进行数字化处理。压缩过的图像是无法直 接进行数字化处理的,如JPEG,GIF等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法,后面我们将针对特殊的文件格式 如何转换为BMP格式的文件问题讨论,经过转换,我们就可以利用得到的未压缩的BMP文件格式进行后续处理。对于JPEG,GIF等格式,由于涉及到压缩 算法,这要求有一定的信息论方面的知识,
BMP文件结构
BMP文件组成
BMP文件由文件头,位图信息头,颜色信息和图形数据四部分组成。文件头主要包含文件的大小,文件类型,图像数据偏离文件的长度等信息,位图信息头 包含图象的尺寸信息,图像用几个比特数值来表示一个像素,图像是否压缩,图像所用的颜色数等信息,颜色信息包仿图像所用到的颜色表,显示图像时需要用到这 个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图 像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,就就是说,在BMP文件中首先存的的是图像的最后一行像素,最后 才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的顺序存府的,另外一个需要关注的细节是:文件存储力像的每一行像素值时,如果存储该 行像素值为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。
BMP文件头
BMP文件头数据结构含有BMP文件的类型,文件大小和位图起始位置等信息。其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //位图文件的类型,必须为“BM”
DWORD bfSize; //位图文件的大小,以字节为单位
WORD bfReserved1;//位图文件保留字,必须为0
WORD bfReserved2;//位力文件保留字,必须为0
DWORD bfOffBits;//位图数据的起始位置,以相对于位图文件的偏移量表示,以字节为单位
}BITMAPFILEHEADER;该结构占据14个字节。
位图信息头
BMP位图信息头数据用于说明位图的尺寸等信息,其结构如下:
typedef struct tagBITMAPINF OHEADER{
DWORD biSize;//本结构所占用字节数
LONG biWidth;//位图的宽度,以像素为单位
LONG biHeight;//位图的高度,以像素为单位
WORD biPlanes;//目标设备的平面数不清,必须为1
WORD biBitCount;//每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORD biCompression;//位图压缩类型,必须是0(不压缩)1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeimage;//位图的大小,以字节为单位
LONG biXPelsPerMeter;//位图水平分辨率,每米像素数
LONG biYPelsPerMeter;//位图垂直分辨率,每米像素数
DWORD biClrUsed;//位图实际使用的颜色表中的颜色数
DOWRD biClrlmportant;//位图显示过程中重要的颜色数
}BITMAPINF OHEADER;该结构占所40个字节。
注意:对于BMP文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图彩用压缩格式,那么16色图像彩用RLE4压缩算法,256色图像彩用RLE8压缩算法。
颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色,RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD{
BYTErgbBlue;//蓝色的亮度(值范围为 0-255)
BYTErgbGreen;//绿色的亮度(值范围为 0-255)
BYTErgbRed;//红色的亮度(值范围为 0-255)
BYTErgbReserved;//保留,必须为0
}RGBQUAD;
颜色表中RGBQUAD结构数据的个数由BITMAPINFOHEADER中的biBitCount项来确定,当biBitCount=1,4,8 时,分别有2,16,256个颜色表项,当biBitCount=24时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分别对应R,G,B值,图 像文件没有颜色表项,位图信息头和颜钩表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO{
BITMAPINFOHEADER bmiHeader;//位图信息头
RGBQUAD bmiColors[1];//颜色表
}BITMAPINFO;
注意:RGBQUAD数据结构中,拉加了一个保留字段rgbReserved,它不代表任何颜色,必须取固定的值为“0”,同时,RGBQUAD结 构中定义的颜色值中,红色,绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为 “00,00,ff,00”,则表示该点为红色,而不是蓝色。
位图数据
位图数据记录了位图的每一个像素值或该对庆像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。这种格式我们又称为 Bottom_Up位图,当然与之相对的还有Up_Down形式的位力,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式。位图的一个像 素值所占的字节点:当biBitCount=1时,8个像素占1个字节;当bitBitCount=4时,2个像素占1个字节,当 biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像。当图像不是为真彩色时, 图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别应 R,B,B分量的值,这时候图像文件中没有颜色表。Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填 充,图像文件中一个扫描行所占的字节数计算方法:
DataSizePerLine=(biWidth*biBitCount+31)/8;//一个扫描行所占的字节数
位图数据的大小按下式计算(不压缩情况下):
DataSize=DataSizePerLine*biHeight
上述是BMP文件格式的说明,搞清楚了以上的结构,就可以正确的操作图像文件,对它进行读或写操作了。
GIF图像文件格式
GIF图象格式的全称为Graphics interchange Format,从这个名字可以看出,这种图像格式主要是为了通过网络传输图像而设计的。GIF文件不支持24位真彩色图像,最多只能存储256色的图像或 灰度图像;GIF格式文件也无法存储CMY和HIS模型的图像数据;另外,GIF图像文件的各种数据区域一般没有固定的数据长度和存储顺序,所以为了方便 程序寻找数据区,将数据区中的第一个字节作为标志符,GIF文件存储图像数据是有二种排列顺序:顺序排列或交叉排列。交叉排列的方式适合网络传输,这样一 来允许用户在不完全掌握图像数据之前,获取当前图像的轮廓数据。
GIF文件格式分为87和89两个版本,对于87这个版本,该文件主要是有五个部分组成,它们是按顺序出现的:文件头块、逻辑屏幕描述块,可选择的 调色板块,图像数据块,最后是标志文件结否的尾块,该块总是取固定的值3BH。其中第一和第二两个块用GIF图像文件头结构描述:
GIFHEADER:{
DB Signature;//该字段占六个字节,为了用于指明图像为GIF格式,前三个字符必须为“GIF”,后三个字符用于指定是哪个版本,87或89
DW ScreenWidth;//
DW ScreenDepth;//占两个字节,以像素为单位表示图像的宽、高
DB GlobalFlagByte;//该字节的各个位用于调色版的描述
DB BackGroundColor;//代表图象的背景颜色的索引
DB AspectRatio;//图像的长宽比
}
GIF格式中的调色板有通用调色板和局部调色板之分,因为GIF格式允许一个文件中存储多个图像,因此有这两种设色板,其中通用调色板适于文件中的 所有图像,而局部调色板只适用于某一个图像。格式中的数据区域一般分为四个部分,图像数据识别区域,局部调色板数据,采用压缩算法得到的图象数据区域和结 束标志区域。
在GIF89版本中,它包含七个部分,分别是文件头,通用调色板数据,图像数据区和四个补充数据区,它们主要是用于提示程序如何处理图像的。
JPEG图像文件
JEPG简称为联合摄影专家小组,作为一种技术,主要用于数字化图像的标准编码,JPEG主要彩用有损的压缩编码方式,它比GIF,BMP图像文件 要复杂的多,这不是短短的几页篇幅可以讲清楚的,幸运的是,我们可以过一些别的方法将该格式转化为BMP格式,读者需要知道的是在对JEPG文件格式编码 时,通常需要分为以下四步:颜色转化,DCT变换,量化,编码。
以上介绍了一些常用的图像文件,对于比较复杂的格式,如GIF和JEPG,仅仅作了简单的介绍,后文我们会和它们作进一步的接触,实际应用中,还有许多图像格式,我们在上面没有提到,如果需要做进一步的研究,参考一些图像格式方面的资料。