在讲解图像识别技术之前,我需要讲一下,如何读入一张位图(Bitmap,即bmp格式的图片文件)。
BMP编码格式
用记事本打开bmp格式文件,映入眼帘的是一行行乱码……
事实上,如果我们将每一个字符对应ASCII,我们就会发现bmp的编码格式。
首先是一个28个字节的图像文件头,这个文件头包括:
1.前两字节是文件标识:一定是BM,代表bmp格式文件。
2.接下来四个字节是文件大小:不过要知道DWORD的存储方法,整数6存储起来就是06 00 00 00,整数257存储起来就是01 01 00 00,整数2147483647存储起来就是ff ff ff 7f。
3.接下来四个字节是保留字符:这个DWORD的值为0。
4.接下来四个字节是偏移量:一个DWORD,表示图片信息距离开头有多少个字节,利于随机读取。
5.接下来四个字节是图像信息头的长度:又是一个DWORD,表示图像信息头的长度。信息头和文件头一样,记录着图像的另一组信息。这个值在windows系统下往往是40。
6.接下来四个字节是图像的宽度,单位是像素:这个不用解释了,一个DWORD代表图像宽度。
7.接下来四个字节是图像的高度,单位是像素:这个也不需要解释了,一个DWORD代表图像高度。
8.接下来两个字节是图像的面数,这个值恒为1:这个WORD就是文件头的最后两个字节,这个值恒为01 00。
然后是图像的信息头,这个信息头包括:
1.两个字节代表图片像素位数:这个WORD一般只有6种情况:1表示单色位图,4表示16色位图,8表示256色位图,16表示16位高彩色位图,24表示24为真彩色位图(也是最常见的情况),32表示32位增强真彩色位图。
2.四个字节表示压缩种类:这个DWORD通常只有四种情况:0表示不压缩(最常见),1表示8位RLE压缩,2表示4位RLE压缩,3表示位域存放压缩。
3.四个字节代表位图数据大小:这个DWORD一定是4的倍数。
4.四个字节代表水平分辨率,单位是像素/米:这个DWORD通常是3780。
5.四个字节代表垂直分辨率,单位是像素/米:这个DWORD通常也是3780。
6.四个字节表示位图用到的颜色数:往往是0(默认值)或者2^颜色位数。
7.四个字节代表重要的颜色数:往往是0或者和上面这个DWORD相等。
8.调色板:对于调色板中的每一项,用四个字节描述RGB:蓝、绿、红、最后一个字节保留为0。
最后就是图像的数据,这些数据可以是实际RGB值,也可以是在调色板中的编号。
Bitmap24_Reader的C++实现
为了方便以后图像识别,我们需要实现Bitmap24_Reader类,来读入24位真彩色位图的信息。代码如下:
#include
这样我们就可以用以下两种方法读取1.bmp中(x, y)处的RGB:
unsigned
推荐使用第二种方法,方便随时打开文件,同时节省内存(不用了就delete掉)。
关于24位真彩色位图的读入方法也讲完了,第九篇就将是如何用全连接网络实现图像识别。
感谢您的阅读。限于笔者水平,文章定有疏漏。如有不足,敬请斧正!