【Opencv学习】图像表示原理及BMP格式图像的构成

计算机图像表示原理

计算机图像可以分为两类:位图(Bitmap)和矢量图(Metafile)。位图可以被看做是一个表格,整个图像由许多的矩形块组成,每个矩形代表一个点,点的个数等于位图的横向矩形块的个数乘上纵向矩形块的个数,每一个点则被称为像素点,而且每个像素点都有确定的颜色,因此形成了一幅完整的图像。通常使用的图像大部分是位图,如相机拍摄的照片,因为位图可以表示图像的细节,能够较好的还原现实场景。位图的缺点是体积比较大,因此产生了很多压缩图像格式来存储位图图像,目前应用最广的是JPEG格式,另外还有GIF、PNG等。还有个缺点是位图在放大时,会出现“锯齿”现象,这也由位图的本质特点决定。所以在现实中,还需要使用另外一种图像格式:矢量图。

同位图不同,矢量图是利用数学公式通过线段绘制出来的,所以不管如何放大都不会出现失真现象,但是矢量图不能描述非常复杂的图像。所以各种图形图案、CAD软件等等都是使用矢量格式来保存文件。

每个像素采用不同的位数,就可以表示出不同的颜色,颜色数量如下:

  • 4位图像:2^4=16
  • 8位图像:2^8=256
  • 16位图像:2^16=65536
  • 24位图像:2^24=16777216

由此可知当采用1Bytes(8bit)来存储一个像素点的像素值时,可以得到256种不同的结果,采用3Bytes(24bit)时,可以有16777216种不同结果,而不同的结果又代表不同的颜色,这已经接近人眼所能分辨的颜色了。计算机中使用最多的就是24位色,另外在GDI+中还有一种32位色,多出来一个通道用来描述Alpha,即透明分量。

在位图中使用RGB三色空间表示颜色(位数少时要使用调色板),在24位彩色图像中,3个字节分别表示R、G、B三种颜色分量,这其中是没有亮度分量的,这是因为在RGB表示方式中,亮度也是直接可以从颜色分量重得到的,每一颜色分量值的范围都是0~255,某一颜色分量的值越大,就表示这一分量的亮度值越高。一个真彩色像素点转换为灰度图时它的亮度值则采用了心理学灰度公式计算:

Y=0.299R+0.587G+0.114B

使用上述公式转换时得到的灰度图最接近人眼对灰度图的感觉。灰度图中颜色数量一共只有256种(8bit),所以转换后的图像保存为8位格式,可以节省空间。因此彩色图像转变为灰度图像是不可逆的过程。调色板中可以保存256颜色,所以可以正好将256种灰度颜色保存到调色板中。

BMP图像

BMP(Bitmap-file)图形文件是Windows采用的图形文件格式,图像处理软件均支持BMP图像文件格式。其采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩。BMP文件的图像深度可选1bit、4bit、8bit及24bit,存储数据时,图像的扫描方式是从左向右、从下到上的顺序。

组成

BMP图像文件由4部分组成:

  1. 文件头(BMP file header):文件的格式、大小等信息;
  2. 信息头(Bitmap information):图像数据的尺寸、位平面数、压缩方式、颜色索引等信息;
  3. 调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表;
  4. 位图数据(bitmap data):图像数据区;

BMP文件头结构体定义如下:

typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType;//2Bytes,必须为"BM",即0x424D才是Windows位图文件
DWORD bfSize;//4Bytes,整个BMP文件的大小
UINT16 bfReserved1;//2Bytes,保留,为0
UINT16 bfReserved2;//2Bytes,保留,为0
DWORD bfOffBits;//4Bytes,文件起始位置到图像像素数据的字节偏移量
}BITMAPFILEHEADER;

BMP信息头结构体定义如下:

typedef struct_tagBMP_INFOHEADER
{
DWORD biSize;//4Bytes ,INFOHEADER结构体大小,存在其他版本INFOHEADER,用作区分
LONG biWidth;//4Bytes,图像宽度(以像素为单位)
LONG biHeight;//4Bytes,图像高度,+:图像存储顺序为Bottom2Top,-:TopBottom
WORD biPlanes;//2Bytes,图像数据平面,BMP存储RGB数据,因此总为1
WORD biBitCount;//2Bytes,图像像素位数
DWORD biCompression;//4Bytes,0:不压缩,1:RLE8,2:RLE4
DWORD biSizeImage;//4Bytes, 4字节对齐的图像数据大小
LONG biXPelsPerMeter;//4Bytes,用像素/米表示的水平分辨率
LONG biYPelsPerMeter;//4Bytes,用像素/米表示的垂直分辨率
DWORD biClrUsed;//4Bytes,实际使用的调色板索引数,0:使用所有的调色板索引
DWORD biClrImportant;//4Bytes,重要的调色板索引数,0:所有的调色板索引都重要
}BMP_INFOHEADER;

BMP调色板结构体定义如下:

typedef struct_tagRGBQUAD
{
BYTE rgbBlue;//指定蓝色强度
BYTE rgbGreen;//指定绿色强度
BYTE rgbRed;//指定红色强度
BYTE rgbReserved;//保留,设置为0
}RGBQUAD;

BMP图像数据区:
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从上到下。位图的一个像素值所占字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
一个扫描行所占的字节数计算方法:

DataSizePerLine = (biWidth*biBitCount+31)/8;
//一个扫描行所占的字节数
DataSizePerLine=DataSizePerLine/4*4;//字节数必须是4的倍数位图数据的

大小(不压缩情况下):

Datasize=DataSizePerLine*biHeight;

颜色表接下来位于位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随着颜色模式而定,既2色图像每点占1位(8位1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);
真彩色图像每点占24位(3字节)。所以整个数据区的大小也会随之变化。究其规律,可得出如下公式:
图像数据信息大小=(图像宽度图像高度记录像素的位数)/8

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值