数字图像处理(一)
HX-5509开发板
位图 位图(Bitmap)图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述图像。计算机屏幕其实就是一张包含大量像素点的网格。当我们把位图放大时,每一个像素小点看上去就像是一个个马赛克色块。 BMP位图文件 常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。 BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图文件默认的文件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。
位图 位图图像一般分为单色图像、灰度图像和彩色图像。单色图像只有黑色和白色两种颜色, 整个图像由单纯的黑色点和白色点组成。彩色图像的像素点是由R (红色)、G (绿色)、B (兰色) 三元色混合而成的, 不同含量的R、G、B 组成不同的颜色, 每一个记录单个像素的位数据单元可表示任意一种颜色。 根据这个记录单个像素信息的位数据单元所占位数大小, 可分为8 位、16 位、24 位和32 位等几种位图。 8 位位图是指图像一个像素点的颜色信息用8 个位(一个字节) 来表示; 同样, 16 位位图用16 个位(二个字节) 来表示, 其中R、G、B分别占5 位, 另外1 位他用; 24 位位图用24 个位(三个字节) 来表示, 其中R 占8 位、G 占8 位、B 占8 位。 如果称不同深度的颜色为一色的话, 灰度图像就不止只有黑色和白色两种颜色, 一般使用的灰度图为256 级灰度图, 就是说图像由256 种不同灰度级的颜色组成
BMP文件结构 BMP文件由4部分组成: 1.位图文件头(bitmap-file header) 2. 位图信息头(bitmap-information header) 3. 颜色表(color table) 4. 颜色点阵数据(bits data) 24位真彩色位图没有颜色表,所以只有1、2、4这三部分。 位图文件头 其结构定义如下: typedef struct tagBITMAPFILEHEADER{ WORD bfType; // 位图文件的类型,必须为BM DWORD bfSize; // 位图文件的大小,以字节为单位 WORD bfReserved1; // 位图文件保留字,必须为0 WORD bfReserved2; // 位图文件保留字,必须为0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位 } BITMAPFILEHEADER;
BMP文件结构 位图信息头 BMP位图信息头数据用于说明位图的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构所占用字节数 LONGbiWidth; // 位图的宽度,以像素为单位 LONGbiHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的级别,必须为1 WORD biBitCount// 每个像素所需的位数,必须是1(双色), // 4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数 LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER;
BMP文件结构 颜色表 颜色表中RGBQUAD结构数据的个数有biBitCount来确定: typedef struct tagRGBQUAD { BYTErgbBlue;// 蓝色的亮度(值范围为0-255) BYTErgbGreen; // 绿色的亮度(值范围为0-255) BYTErgbRed; // 红色的亮度(值范围为0-255) BYTErgbReserved;// 保留,必须为0 } RGBQUAD; 颜色表中RGBQUAD结构数据的个数有biBitCount来确定: 当biBitCount=1,4,8时,分别有2,16,256个表项; 当biBitCount=24时,没有颜色表项。 位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD bmiColors[1]; // 颜色表 } BITMAPINFO;
字节序 字节序是与cpu平台有关的 在小字节序的机器上,一个整形数的内存分布是高字节占高地址,低字节占低地址,这是8086的基本常识。Windows一般是小字节序。 例如,bfSize的数据为50 00 00 00,实际上就成了0x00000050,也就是0x50。 服务器和嵌入式系统的CPU都是大字节序的,高字节占低地址,低字节占高地址 TI的DSP为大字节序(big endian),如数据0xAABB在内存中存放模型如下: 地址 0x20000 0x20001 … AA BB