数字图像基础
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像
定义:数字图像可以定义为与之相对应的物体的数字表示。
通常用一个二维数组表示一幅图像,也可以认为一幅图像就是一个二维矩阵。
二维矩阵的每个位置对应于图像上的每个像素点,而二维矩阵每个位置上存储的数值对应于图像上每个像素点所具有的信息,比如:灰度等等。
既然数字图像可以用二维矩阵来表示,那么数字图像的处理就可以认为是对对二维矩阵的操作。
图像的数字化:
将一幅图像进行数字化的过程就是在计算机上创建生成一个二维矩阵的过程。
数字化过程包括三个步骤:扫描、采样、量化。
扫描:就是按照一定的先后顺序(如:行优先)对图像进行遍历的过程。
像素是遍历过程中寻址的最小单位,对应于数组寻址的单位。
采样:即遍历过程中在在图像的每个最小寻址单位即像素位置上测量灰度值,采样的结果是得到每一像素的灰度值。
量化:就是将采样得到的像素灰度值经过模数转换等器件转化为离散的整数值。
数字图像处理中的基本图像类型: 二值图像:二值图像的矩阵仅有两个值构成即“0”和“1”。
0 表示黑色,1表示白色。
因此二值图像在计算机中的数据类型为一个二进制位。
灰度图像:灰度图像的二维矩阵每个元素的值可能都不一样,它有一个范围【0~255】,其中0表示纯黑色,255表示纯白色,中间数字表示由黑到白的过度。
其数据类型一般为8位无符号数。
索引图像:索引图像可以表示彩色图像,其结构比较复杂,除了存储图像数据的二维矩阵以外,还有一个存储RGB 颜色的二维矩阵,称为颜色索引矩阵(COLORMAP )。
存储数据的二维矩阵里面存储的仍然是图像各个像素的灰度值,而颜色索引矩阵是一个【256】【3】形式的二维矩阵,256对应于0~255个灰度值,而每行的三个分量表示对应于每个灰度值的像素点,它的RGB 分量的值。
例如:COLORMAP[38][0~2]表示灰度值为38的像素点的RGB 各分量值。
由于每个像素只有256个灰度值,而每个灰度值决定了一种颜色,所以索引图像最多有256种颜色。
RGB 图像:它与索引图像一样可以表示彩色图像,分别用R ,G,,B 三原色表示每个像素的颜色,但是他们的数据结构不同。
RGB 图像的数据结构是一个三维矩阵,它的每一像素的颜色值直接存储在矩阵中。
因此这个矩阵可用M*N*3来表示。
M :表示矩阵每行的像素数,N :表示每列的像素数,3表示每一像素的三个颜色分量。
由于每个像素的颜色值都 直接放在图像矩阵中,所以其颜色理论上多达(23
*23
*23
)种。
图像的统计特征:
1. 信息量:一幅图像如果共有q种灰度值并且出现的概率分别是p 1,p 2
,p
3
,…
p
q
,
则根据香农定理,这幅图像的信息量可有下式表示:
p p i
q
i i
H log 2
1
∑
=-= (1)
; H 通称为熵,当图像中个灰度值出现的概率彼此相等时,图像的熵最大。
2.
计算灰度平均值:灰度平均值是指一幅图像中所有像素灰度值的算术平均数,它反应图像中不同物体的平均反射强度,一般用下式表示:
MN
j i f f M i N j ∑∑-=-==
1010
)
,( (2)
3. 计算灰度中值:灰度中值是指图像中所有灰度处于中间的值,当当灰度级数为偶数时,则取中间的两个灰度的平均值。
4. 计算灰度众数:灰度众数就是指图像中出现次数最多的灰度值,它是一幅图像中面积占优的物体的灰度特征的反应。
5.
计算灰度标准差:灰度标准差是反映各像素灰度值与图像平均灰度值的总的离散程度,它与熵一样是衡量一幅图像信息量大小的主要指标,是图像统计特征中最重要的统计量之一。
一般情况下,标准差越大图像信息量越大。
计算公式如下:
[]
MN
f j i f S M i N j ∑∑-=-=-=
1010
),( (3)
6.计算灰度值域:灰度值域是图像最大灰度与最小灰度的差值,即
),(),()
,(min
max
j i f j i f j i f
range
-=
(4)
计算多为图像的统计特征:
1. 计算协方差矩阵:设),(j i f 和),(j i g 是大小为N M ⨯的两幅图像,则两者之间的协
方差计算公式为:
[][]g j i g f j i f MN
M o i N j fg
gf
S S
--==∑∑-=-=),(),(1110
2
2 (5)
式中f 和g ——图像),(j i f 和),(j i g 的均值
将N 个波段相互间的协方差排列在一起所组成的矩阵称为协方差矩阵∑
,即
⎥⎥⎥
⎥⎥
⎦⎤⎢⎢⎢
⎢⎢⎣⎡=∑
s s
s s
s s s s
s NN N N N N 2
22
21
2
2222
2212
12
12211
(6)
2.计算相关系数 相关系数是描述图像波段间的相关程度的统计量,反映了两个波段图像所含信息的重叠程度。
如果两个波段的相关系数较大,则说明仅选择一个波段就可以表示两个波段的信息。
特别的,一个波段与其本身的相关系数是1,表明完全重叠。
计算公式为:
S
S S
corr
gg
ff
fg fg
2=
(7)
式中S
ff
、
S
gg
——图像f 、g 的标准差
S
fg
2 ——图像f 、g 的协方差
将N 个波段相互间的相关系数排列在一起组成的矩阵称为相关矩阵R ,即
⎥
⎥
⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡=NN N N N N r r r r r r r R 2
1
221
11211
(8)
另外,图像的统计特征还包括直方图特征,直方图指图像中所有灰度值的概率分布,对于数字图像来说,实际上就是图像灰度值的概率密度函数的离散化图形。
图像处理
图像处理的一般步骤: 1. 获取原始图像 2. 预处理
a) 滤波降噪 b) 图像增强 c) 图像分割 3. 特征提取
4. 数据融合,包括三个方面:像素级融合,特征级融合,决策级融合。
5. 分类决策
下面着重讲述图像分割:
图像分割:就是依据图像的灰度、颜色、纹理、边缘等特征,把图像分成各自满足某种相似性准则或具有某种共同特征的连通区域集合的过程。
设R 代表某个图像区域,对R 的分割可看作将R 分成若干个满足以下条件的非空子集(子区域)R1,R2,……R n 。
(1)
R R
n
i i
== 1。
即分割成的所有子区域的并集能够构成原来的区域R 。
(2)对于所有的i 和j 以及i ≠j ,有=j i R R ∅。
即分割成的各子区域互不重叠。
(3)对于i=1,2,3,……n;有P(R i)=TURE 。
即分割得到的属于同一区域的像素应具有某些相同的特性。
(4)对于i ≠j,有P(R i ∪R j )=FALSE 。
即分割得到的属于不同区域的像素应具有不同的性质
(5)对于i=1,2,……n;R i 是联通的区域。
即同一子区域的像素应当是连通的。
图像分割的方法:
图像分割的方法有很多,总体上讲有如下几类比较常用:基于边缘检测的图像分割、基于阈值的图像分割、基于跟踪的图像分割、基于区域的图像分割(基于聚类的图像分割)。
一:基于边缘检测的图像分割 图像边缘:图像边缘意味着图像中一个区域的结束和另一个区域的开始,图像中相邻区域之间的像素集合构成了图像的边缘。
图像边缘即图像的灰度发生空间突变的像素的集合 图像边缘有两个特征:方向和幅度。
沿边缘走向,像素值变化比较缓慢; 沿垂直于边缘走向,像素值变化比较剧烈。
一般常用一阶和二阶导数来描述和检测边缘,而导数可利用微分算子来计算。
对于数字图像来说,通常利用差分来近似微分。
一介微分梯度边缘检测:
设f(x,y)为连续图像函数,G x 和G y 分别为x 方向和y 方向的梯度,且在点(x, y )处的梯度可以表示为一个矢量,并有其梯度定义:
T
y y x f x y x f y x f G ⎥⎦
⎤
⎢
⎣⎡∂∂∂∂=),()
,()),(( (9)
对应于欧式距离的梯度幅值:
2
2|),(|y x G G y x G += (10)
对应于棋盘距离的梯度幅值:
|||||),(|4y x G G y x G += (11)
对应于街区距离的梯度幅值:
|}||max {||),(|8y x G G y x G +≈ (12)
有梯度矢量幅角表示的梯度方向是函数f(x, y)增加最快的方向:
)/arctan(),(y x G G y x =φ (13)
几个常用算子: (1) Roberts 算子
是一个交叉算子,其在点(i, j )的梯度幅值表示为:
|)1,(),1(||)1,1(),(|),(+-++++-=j i f j i f j i f j i f j i G (14)
卷积模板可表示为:
|||||),(|y x G G j i G += (15)
其中, Gx 和G y 分别为:
⎥⎦
⎤⎢⎣⎡-=⎥
⎦⎤⎢⎣⎡-=01101001y x G G (16)
(2) Sobel 算子
Sobel 算子在点(i, j )的梯度幅值表示为:
s s y x j i S 2
2),(+=
(17)
简化的卷积模板表示形式:
||||),(s s y x j i S +=
(18)
其中,S x 和 S y 分别是x 方向和y 方向梯度的模板表示:
⎥⎥⎥
⎦
⎤⎢⎢⎢⎣⎡---=⎥⎥
⎥⎦⎤⎢⎢⎢⎣⎡---=121000121
101202101s s y x (19)
(2) Prewitt 算子
(3) Prewitt 算子在点(i, j )的梯度幅值表示为:
s s y x j i S 2
2),(+=
(20)
简化的卷积模板表示形式为:
||||),(s s y x j i S += (21)
其中,S x 和S y 分别是X 方向和Y 方向提督的模板形式:
⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡---=⎥⎥⎥⎦⎤
⎢⎢⎢⎣⎡---=111000111
101101101s s y x (22) 二阶微分边缘检测:
拉普拉斯二阶导数算子:
222
22
y
f
x f f ∂∂+∂∂=∇ (23) 二阶差分的偏导数近似式为:
)
,(),1(2),2(),(),1()),(),1((2
2j i f j i f j i f x
j i f x j i f x j i f j i f x G x
f x ++-+=∂∂-∂+∂=∂-+∂=∂∂=∂∂ (24)
以上是以(i+1, j )为中心,用i 替换 i+1可得一(i, j )为中心的二阶偏导数公式: 也即有:
),1(),(2),1(22j i f j i f j i f x
f -+-+=∂∂ (25) 同理有:
)1,(),(2)1,(2
2-+-+=∂∂j i f j i f j i f y f
(26) 所以有:
)1,(),1(),(4)1,(),1(222
2-+-+-+++=∂∂+∂∂j i f j i f j i f j i f j i f y
f
x f (27) 对应的集中模板为:
⎥⎥⎥⎦
⎤
⎢⎢⎢⎣⎡--------⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡----111181111010141010 (28)
基于阈值的图像分割方法: 基于阈值的图像分割方法是提取物体与背景在灰度上的差异,把图像分为具有不同灰度级的目标区域和背景区域的一种图像分割技术。
基本思想:首先确定一个灰度阈值,然后将灰度值大于给定阈值的像素判归为某一物体,赋予同一个编号,将灰度值小于给定阈值的像素归为另一物体,赋予另一个相同的编号。
适用情况:被分割物体的灰度值比较均一并且它周围背景的灰度值也比较均一。
公式: 单阈值情况:
⎩⎨
⎧≤≥=T
y x f T y x f y x g ),(0
),(1
),( (9)
多阈值情况:
),,2,1,
),((),(1N k T y x f T k
y x g k k =<≤=- (10)
式中,T k 为各个分割阈值,假定共有N 个阈值。
半阈值化分割:图像经阈值化分割后不是表示成二值和多值图像,而是将比阈值大的像素的灰度保持不变,而将比阈值小的像素的灰度变为黑色;或者将比阈值小的像素的灰度保持不变,而将比阈值大的像素变为白色。
公式如下: ⎩⎨
⎧<≥=T
y x f T y x f y x f y x g ),(0
),()
,(),( (11)
⎩⎨
⎧>≤=T
y x f T y x f y x f y x g ),(0
),()
,(),( (12)
基于跟踪的图像分割:先通过对图像上的点的简便运算,来检测出可能存在的物体上的点,然后在检测的点的基础上通过跟踪运算来检测物体的边缘轮廓的一种图像分割方法。
轮廓跟踪法:一种适用于黑白二值图像的分割方法,算法如下:
(1) 在靠近边缘处任取一起始点,然后按照每次只前进一步,步距为一个像素的原
则进行跟踪;
(2) 当跟踪中的某步是由白区进入黑区时,以后各步向左转,知直到穿出黑区为止 (3) 当跟踪的某步是由黑区进入白区时,以后各步向右转,直到穿出白区为止; (4) 当围绕目标边界循环跟踪一周回到起点时,则所跟踪的轨迹就是目标的轮廓;
否则继续按(2)和(3)的原则进行跟踪。
轮廓跟踪法可能使某些凸起部分被漏掉。
利用不同起点跟踪凸起部分
光栅跟踪方法:先利用检测准则确定接受对象点,然后根据已有的接受对象点和跟踪准则确定新的接受对象点,最后将所有标记为1且相邻的对象点联接起来就得到了检测到的细曲线。
◆需要事先确定检测阈值d、跟踪阈值t,且要求d>t。
◆检测准则:对图像逐行扫描,将每一行中灰度值大于或等于检测阈值d的所有点(称为接受对象点)记为1。
◆跟踪准则:设位于第i行的点(i,j)为接受对象点,如果位于第i+1行上的相邻点(i+1,j-1)、(i+1,j)和(i+1,j+1)的灰度值大于或等于跟踪阈值t,就将其确定为新的接受对象点,并记为1。
光栅跟踪图像分割算法:
(1)确定检测阈值d和跟踪阈值t,且要求d>t;
(2)用检测阈值d逐行对图像进行扫描,依次将灰度值大于或等于检测阈值d的点的位置记为1;
(3)逐行扫描图像,若图像中的(i,j)点为接受对象点,则在第i+1行上找点(i,j)的邻点:
(i+1,j-1)、(i+1,j)、(i+1,j+1)
并将其中灰度值大于或等于跟踪阈值t的邻点确定为新的接受对象点,将相应位置记为1;
(4)重复步骤(3),直至图像中除最末一行以外的所有接受点扫描完为止。
基于区域的图像分割:
基于区域的图像分割是根据图像的灰度、纹理、颜色和图像像素统计特征的均匀性等图像的空间局部特征,把图像中的像素划归到各个物体或区域中,进而将图像分割成若干个不同区域的一种分割方法。
区域生长法:区域生长法的基本思想是根据事先定义的相似性准则,将图像中满足相似性准则的像素或子区域聚合成更大区域的过程。
区域生长的基本方法是首先在每个需要分割的区域中找一个“种子”像素作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素合并到种子像素所在的区域中,接着以合并成的区域中的所有像素作为新的种子像素继续上面的相似性判别与合并过程,直到再没有满足相似性条件的像素可被合并进来为止。
这样就使得满足相似性条件的像素就组成(生长成)了一个区域。
区域生长法的三个关键条件的确定:
(1)选择和确定一组能正确代表所需区域的种子像素
一般原则为:
①接近聚类重心的像素可作为种子像素。
例如,图像直方图中像素最多且处在聚类中心的像素;
②红外图像目标检测中最亮的像素可作为种子像素;
③按位置要求确定种子像素;
④根据某种经验确定种子像素。
(2) 确定在生长过程中能将相邻像素合并进来的相似性准则。
主要有:
①当图像是彩色图像时,可以各颜色为准则,并考虑图像的连通性和邻近性;
②待检测像素点的灰度值与已合并成的区域中所有像素点的平均灰度值满足某种相似性标准,比如灰度值差小于某个值;
③待检测点与已合并成的区域构成的新区域符合某个大小尺寸或形状要求等。
(3) 确定终止生长过程的条件或规则
①一般的停止生长准则是生长过程进行到没有满足生长准则的像素时为止;
②其它与生长区域需要的尺寸、形状等全局特性有关的准则。
分裂合并法
分裂-合并分割法是从整个图像出发,根据图像和各区域的不均匀性,把图像或区域分裂成新的子区域;根据毗邻区域的均匀性,把毗邻的子区域合并成新的较大区域。
如果把整幅图像分成大小相同的4个方形象限区域,并接着把得到的新区域进一步分成大小相同的4个更小的象限区域,如此不断继续分割下去,就会得到一个以该图像为树根,以分成的新区域或更小区域为中间结点或树叶结点的四叉树。
分裂-合并分割法
设同一区域Ri中的所有像素满足某一相似性准则时,P(Ri)=TRUE,否则P(Ri)=FALSE。
(1)将图像R分成4个大小相同的象限区域Ri,i=1,2,3,4;
(2)对于任何的Ri,如果P(Ri)=FALSE,则将该Ri再进一步拆分成4个更小的象限区域;
(3)如果此时存在任意相邻的两个区域Rj和Rk使P(Rj∪Rk)=TRUE成立,就将Rj 和Rk进行合并;
(4)重复(2)和(3),直到无法进行拆分和合并为止。
对于灰度图象的一些可以选择的分裂-合并准则:
(1)同一区域中最大灰度值与最小灰度值之差或方差小于某选定的阈值;
(2)两个区域的平均灰度值之差及方差小于某个选定的阈值;
(3)两个区域的灰度分布函数之差小于某个选定的阈值;
(4)两个区域的某种图像统计特征值的差小于等于某个阈值。
BMP图像文件的结构
1.概述:
位图文件的基本结构:位图文件由文件头、信息头、颜色信息和图像数据四部分组成。
文件头主要包含文件的大小,文件的类型,图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩,图像所用的颜色数等信息。
颜色信息包含图像所用的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。
文件中的数据块表示图像的相应的像素值。
特别需要注意的是:图像的像素值在文件中存放的顺序为从左到右,从下到上,也就是说在BMP图像文件中首先存放的是图像的最后一行像素,最后存储图像的第一行像素,但对于同一行的像素,则是按
照从左到右的顺序存储的;另外,文件存储图像的每一行像素时,所占的字节数必须为4的倍数,不足的在后面补零。
2.BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件的大小、和位图数据的起始位置。
结构定义如下:
Typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为“BM”
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;该结构占据14个字节。
3.位图信息头
位图信息头用于说明位图尺寸信息等
typedef struct tagBITMAPINFOHEADER
{
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;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;该结构占据40个字节。
注意:对于BMP文件格式,一般都不对图像数据进行压缩处理,如果位图采用压缩处理的话,那么16色彩采用RLE4压缩算法,256色的图像采用RLE8压缩算法。
4.颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表象是一个RGBQUAD类型的结构,定义一种颜色。
RGBQUAD的结构定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue;// 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved;// 保留,必须为0
} RGBQUAD;
注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何颜色,必须取固定的值为“0”,同时,RGBQUAD结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为“00,00,ff,00”,则表示该点为红色,而不是蓝色
颜色表中RGBQUAD结构的个数有BITMAPINFOHEADER中的biBitCount项来确定,
当biBItcount =1,4,8时,分别有2,16,256个颜色表项。
当biBitCount = 24时,图像为真彩色,图像中每个像素的颜色用三个字节来表示,分别对应R、G、B的值,图像文件没有颜色表项。
5.位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
6.位图数据
位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序在同一扫描行是从左到右扫描,在扫描行之间是从下到上扫描。
这种格式又称为bottom_up位图。
每个像素所占的字节数:当biBitCount = 1时,一个像素占一位,8个像素占一个字节;当biBitCount = 4时,一个像素值占4位,两个像素占一个字节;当biBitCoount = 8时,一个像素占一个字节;当biBitCount = 24时,一个像素占三个字节,此时图像为真彩色图像,当图像不为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值。
当为真彩色时,每一个像素用三个字节表示图像相应像素点的彩色值,每个字节分别对应R、G、B分量的值,这时图像文件中没有颜色表。
图像文件中一个扫描行所占字节数的计算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;// 一个扫描行所占的字节数
注意:加31 是因为Windows规定图像文件一个扫描行所占字节数必须为4的倍数,因为是取整操作,所以如果最后不够四个字节的话就会丢失,所以加上31再取整,这样就能把最后不够四个字节的部分取上。
位图数据的大小按下式计算(不压缩情况):
DataSize= DataSizePerLine* biHeight。
typedef struct tagBITMAP
{
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
typedef struct tagRGBTRIPLE {
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} RGBTRIPLE;
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
typedef RGBQUAD FAR* LPRGBQUAD;
typedef struct tagBITMAPCOREHEADER {
DWORD bcSize; /* used to get to color table */
WORD bcWidth;
WORD bcHeight;
WORD bcPlanes;
WORD bcBitCount;
} BITMAPCOREHEADER, FAR *LPBITMAPCOREHEADER, *PBITMAPCOREHEADER;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagPALETTEENTRY {
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY, *PPALETTEENTRY, FAR *LPPALETTEENTRY;
typedef struct tagLOGPALETTE {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE, *PLOGPALETTE, NEAR *NPLOGPALETTE, FAR *LPLOGPALETTE;
typedef struct tagDIBSECTION {
BITMAP dsBm;
BITMAPINFOHEADER dsBmih;
DWORD dsBitfields[3];
HANDLE dshSection;
DWORD dsOffset;
} DIBSECTION, FAR *LPDIBSECTION, *PDIBSECTION;。