浅谈图像处理与BMP图像文件格式
2014-03-28陈瑜轩
宋 亮,陈瑜轩
(1.海军装备部 陕西 西安 710043;2.中国航空计算技术研究所 陕西 西安 710068)
平时常常会看到类似PhotoShop或Corel PhotoPaint等软件绘制出的精美图片,同时可以对原有的图像进行处理,得到自己想要的结果,就像PhotoShop那样。而这个处理过程,就是数字图像处理(Digital Image Processing),又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理(Digital Image Processing)技术是一门非常实用的技术。PhotoShop的核心就是图像处理技术。如果掌握了数字图像处理的基本算法就可以通过编程来实现了。经历了这么多年的发展,图像处理经历了从静止图像到活动图像;从单色图像到彩色图像;从客观图像到主观图像;从二维图像到三维图像的发展历程。特别是与计算机图形学的结合已能产生高度逼真、非常纯净、更有创造性的图像。由此派生出来的虚拟现实技术的发展或许将从根本上改变人们的学习、生产和生活方式[1]。
1 数字图像和图像处理的基本概念
数字图像处理是一门关于如何使用计算机对图像进行处理的学科,而数字图像是由被称作像素的小块区域组成的二维矩阵。对于单色即灰度图像而言,每个像素的亮度用一个数值来表示,通常数值范围在0~255之间,即可用一个字节来表示,0表示黑、255表示白,而其他表示灰度。
彩色图像可以用红、绿、蓝三元组组成的二维矩阵表示。通常,三元组的每个数值也在0~255之间,0表示相应的基色在该像素中没有,而255则代表相应的基色在该像素中取得最大值,这种情况下每个像素可用3个字节来表示[2]。
所谓图像处理,就是对图像信息进行加工以满足人的视觉心理或者应用需求的行为。图像处理的手段有光学方法、电子学(数字)方法。后者正是要讨论的数字图像处理,它是指使用计算机加工处理图像,通过各种处理算法来实现对图像内容处理。本论文只处理BMP格式的图片进行讨论。
2 BMP图像文件格式
2.1 BMP图像文件格式的基本概念
BMP(bitmap)文件由文件头、位图信息头、颜色信息和图形数据4部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图像的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到几个颜色表来生成调色板,但如果图像为真彩色,即图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对于同一行的像素,则是按照先左边后右边的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储;否则,需要在后端补0,凑足4的倍数[3]。位图文件的结构如表1所示。
表1 位图文件结构Tab.1 Bitmap file structure
2.1.1 位图头文件
第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:
typedef struct tagBITMAPFILEHEADER{
WORD bfType; //位图文件的类型,必须为BM
DWORD bfSize; //位图文件的大小,字节单位
WORD bfReserved1; //位图文件保留字,必须为0
WORD bfReserved2; //位图文件保留字,必须为0
DWORD bfOffBits; //位图文件头到数据的偏移
}BITMAPFILEHEADER[4];
2.1.2 位图信息头
第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //该结构所占字节数
LONG biWidth; //位图的宽度,像素单位
LONG biHeight; //位图的高度,像素单位
WORD biPlanes; //目标设备的位面数,必须为1
WORD biBitCount; //颜色深度,即每个像素所占的位数
DWORD biCompression; //位图的压缩类型
DWORD biSizeImage; //位图的大小,字节单位
LONG biXPelsPerMeter; //位图水平分辨率
LONG biYPelsPerMeter; //位图的垂直分辨率
DWORD biClrUsed; //位图实际使用的颜色表中颜色数
DWORD biClrImportant; //位图显示中比较重要的颜色数
} BITMAPINFOHEADER;
2.1.3 颜色表
第三部分为颜色表RGBQUAD。当然这是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。
颜色表实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2biBitCount个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
typedef struct tagRGBQUAD{
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
位图信息头和颜色表组成位图信息结构BITMAPINFO,其定义如下:
typedef struct tagBITMAPINFO{
BITMAPINFOHEADER bmiHeader; //位图信息头
RGBQUAD bmiColors[1]; //颜色表
} BITMAPINFO[5];
2.1.4 实际的位图数据
第四部分就是实际的图像数据IMAGEDATA。对于用到颜色表的位图,图像数据就是该像素在颜色表中的索引值。对于真彩色图,图像数据就是实际的R、G、B值[6]。
1)对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。
2)对于16色位图,用4位表示一个像素的颜色,所以一个字节可以表示2个像素。
3)对于256色位图,1个字节刚好可以表示1个像素。
4)对于真彩色图,3个字节才能表示1个像素。
在这里要注意两点:
1)每一行的字节数必须是4的整倍数,如果不是,则需要补齐。
2)一般来说,.BMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图像最下面一行的左边第一个像素,然后是左边第二个像素…接下来是倒数第二行左边第一个像素,左边第二个像素…依次类推,最后得到的是最上面一行的最右一个像素。
2.2 调色板及其作用
现实世界的颜色很多,但计算机只能表示其中的部分颜色。为了计算机能最好的重现实际图景,就要采用一定的技术来管理颜色,从Windows3.0起,微软就开始提供了调色板技术来作为颜色处理的一种通用方法。
假如有一个长宽各为200像素,颜色素为16色的彩色图,每一个像素都用R、G、B 3个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个像素需要用3个字节。整个图像要用200×200×3字节,约120K字节,这样占用的空间就太大了。
其实,16色图最多只有16种颜色。如果用一个表:表中的每一行记录一种颜色的R、G、B值。这样当表示一个像素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个像素为红色时,只需要标明0即可。
再来计算一下:16种状态可以用4位(bit)表示,所以一个像素要用半个字节。整个图像用200×200×0.5字节,约20K字节,在加上表占用的字节为3×16字节。整个占用的字节数约为前面的1/6,省了很多空间。这张R、G、B的表,就是调色板,另一种叫法是颜色查找表LUT(Look Up Table)[7]。
2.3 与设备无关位图DIB
本论文主要是基于设备无关的位图DIB(Device-Independent Bitmap)。主要是因为DIB内的位图几乎都没有被压缩,在程序中处理起来比较方便。如果在内存中有DIB,就可以提供指向该DIB的指针作为某些函数的参数,来显示DIB。同时,由前面的介绍可以知道,BMP文件包含了一个DIB,至于BMP文件的格式前面2.1已有讲述。
这里还要引入一个概念——Windows 图形设备接口GDI(Graphics Device Interface)是为与设备无关的图形设计的。因为计算机常与一系列不同的设备结合在一起,如打印机、绘图仪等输出设备以及显示设备等,因而设备无关性的图形能使用户编程时无需考虑特殊的硬件设置,对Windows编程来说非常重要[8]。
Windows应用程序使用图形设备接口和Windows设备驱动程序来支持与设备无关的图形。图形设备接口GDI是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字[8]。图1描述了Windows输出处理流程与GDI的关系。
图1 Windows输出处理流程与GDIFig.1 Windows output process with GDI
计算机输出设备和显示设备种类繁多,包括不同技术标准的显示器、打印机、绘图仪等等,每类设备又包含许多不同的型号。为了适应不同的设备,Windows系统提供应用程序与具体设备分离的功能。操作系统管理并协调一系列输出设备驱动程序,将应用程序的图形输出请求转换为打印机、绘图仪、显示器或其它输出设备上的输出。GDI的设备无关性是Windows操作系统的特色之一。对于开发人员而言,所要做的工作仅仅是在系统的帮助下建立一个与某个实际输出设备的关联,以要求系统加载相应的设备驱动程序,其他的具体输出操作则由系统实现。由此可见,Windows系统分担了应用程序的硬件设备适配器功能。
2.4 构造CDib类
在对DIB位图进行操作时,有以下的一些任务是需要完成的:装载位图、获取位图文件头信息、获取位图信息、获取颜色表信息、获取位图数据信息、获取位图尺寸、获取颜色总数、获取颜色位数、创建位图调色板,绘制位图等[9]。
3 数字图像处理的国内外发展
数字图像处理最早出现于20世纪50年代,早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。首次获得实际成功应用的是美国喷气推进实验室(JPL[10])。他们对航天探测器徘徊者7号在1964年发回的几千张月球照片使用了图像处理技术,如几何校正、灰度变换、去除噪声等方法进行处理,并考虑了太阳位置和月球环境的影响,由计算机成功地绘制出月球表面地图,获得了巨大的成功。数字图像处理取得的另一个巨大成就是在医学上获得的成果。1972年英国EMI公司工程师Housfield发明了用于头颅诊断的X射线计算机断层摄影装置,也就是我们通常所说的CT(Computer Tomograph[11])。CT的基本方法是根据人的头部截面的投影,经计算机处理来重建截面图像,称为图像重建。图像处理技术的深入发展,从70年代中期开始,随着计算机技术和人工智能、思维科学研究的迅速发展,数字图像处理向更高、更深层次发展。人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。其中代表性的成果是70年代末MIT的Marr提出的视觉计算理论,这个理论成为计算机视觉领域其后十多年的主导思想。图像理解虽然在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,有待人们进一步探索。
4 结束语
数字图像处理研究的内容主要有以下几个方面:1)图像变换 由于图像阵列很大,往往采用图像变换方法,将空间域处理转换为变换域处理。2)图像编码压缩 可减少描述图像的数据量,以便节省图像传输、处理时间和减少所占用的存储器容量。3) 图像增强 为了提高图像的质量,如去除噪声[12]。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。本文对图像处理的基本概念进行了介绍,并着重阐述了BMP图像文件格式的基本概念。数字图像处理作为许多学科的重要基础,已经广泛应用于军事、气象、交通等领域,从多方面影响人们的生活。
[1] 吕凤军 .数字图像处理编程入门[M].北京:清华大学出版社,2006.
[2] 韩玉坤.数字图像压缩编码技术综述[N]. 潍坊学院学报,2006年7月.
[3] 周长发.精通Visual C++ 图像处理编程)[M]. 2版.电子工业出版社, 2004.
[4] 高守传,姚领田. Visual C++实践与提高—数字图像处理与工程应用篇[M]. 中国铁道出版社.2006.
[5] MacGregor,J.F Bharati, M.H. Multivariate image analysis for process monitoring and control [J].Proceedings of SPIE - The International Society for Optical Engineering, 2009,26(5):461-462.
[6] 夏明生,张炎生.数字图像增强技术及其在VC++6.0下的实现[N]. 成都信息工程学院学报,2002.
[7] 孔涛.图像滤波算法的若干研究[D].杭州:浙江大学,2005.
[8] 耿生玲,田芳.图像的平滑和锐化的原理及实现[N].青海师范大学学报:自然科学版,2003.
[9] Liu,N.Yan,H.Colour image edge enhancement by two-channel process Electronics Letters[J].1994,12(9):25-28.
[10] 谢燕江.中值滤波在图像去噪中的应用[N].湘南学院学报,2004.
[11] Luengas-Ruiz,Fernando;Aguilera-Longoria[J].Daniel Digital image p rocessing in Contirod p rocess Proceed ings of the Annual Convention of the W ire Association International,1994,36(8):46-50.
[12] 徐志平,钟亦平,张世永.基于交叉视觉皮质模型二值图像形态学算法[J].计算机辅助设计与图形学学报,2007,19(8):991-994.XU Zhi-ping,ZHAONG Yi-ping,ZHANG Shi-yong.The intersecting cortical model two value image morphology algorithm [J].journal,Computer Aided Design and Computer Graphics,2007,19(8):991-994.