16位位图的灰度化处理方法


  

  
[摘要] 灰度化处理是图像处理中很重要的一步,它的结果是后续处理的基础。本文首先介绍了位图的基本结构和色彩系统,然后,着重介绍了十六位位图的灰度化处理方法。

  关键词:灰度化 位图 图像处理

  Abstract: Gray processing is a very important step in image processing, its result is the foundation of later image processing. This paper introduces primary structure of bitmap and color system,and then mainly introduces gray processing method of 16-bit bitmap.

  Key words:Graying Bitmap Image Processing

  1、 引言

  灰度图(GrayScale)是指只含亮度信息,不含色彩信息的图像。灰度化处理是把含有亮度和色彩的彩色图像变换成灰度图像的过程。灰度化处理在许多图像处理中是很重要的一步,他的结果就是后续处理的基础。所以,寻求一种正确有效的灰度化处理方法尤其重要。

  2、设备无关位图(DIB)

  DIB即Device_Independent Bitmap。目前,Windows处理的DIB通常是以BMP文件存在。BMP文件文件有如下的四个部分;

  1)、位图头文件:BITMAPFILEHEADER

  其定义为:

  type struct tag BITMAPFILEHEADER{

  WORD bfType;

  DWORD bfSize;

  WORD bfReserved1;

  WORD bfReserved2;

  OWORD bfOffBits;

  }BITMAPFILEHEADER;

  2)、位图信息头:BITMAINFOHEADER

  其定义为:

  type struttagBITMAPINFOHEADER{

  OWORD biSize:

  DWORD biWidth;

  DWORD biHeight;

  WORD biPlanes:

  WORD BiBitCount:

  DWORD biCOmpression;

  DWORD biSiZelmage;

  DWORD biXPelsPerMeter:

  DWORD biYPelsPerMeter:

  DWORD biClrUsed;

  DWORD biClrlmportant;

  }BITMAPINFOHEADER;

  它的长度固定为40个字节。

  3)调色板(Palette)

  它用来存放位图的颜色,如果是真彩色图,则不需要调色板。其定义为:

  typedef tagRGBQUAD{

  BYTE rgbBlue;

  BYTE rgbGreen;

  BYTE rgbRed;

  BYTE rgbReserved;

  }RGBQUAD;

  4)实际的图像数据

  对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图,图像数据就是实际上的红(R)、绿(G)、兰(B)的值。

  3、色彩系统

  常用的色彩系统有RGB、YIQ、YUV。

  1)、YIQ色彩系统属于NTSC系统。Y是亮度,即图像的灰度值,I和Q则是指色调。它与RGB的关系为:

  

2)、YUV属于PAL系统。Y也是亮度,U和V也是色调。它与RGB的关系为:


                           





  由(1)和(2)式得知,知道图像某点的R、G、B值,要得到亮度信息,则可由下式计算出:

  Y=0.299*R+0.587*G+0.114*B

  在实际计算时,可按下式进行:

  Y=0.30*R+0.59*G+0.11*B......(3)式

  而在用BMP表示的灰度图中,其红(R)、绿(G)、兰(B)三个分量的值相等,即有

  R=G=B......(4)式

  把(4)式代入(1)式中,可得:I=Q=0,即图像没有了色彩信息。

  同理,对YUV色彩系也一样。

  4、灰度化处理

  由上面(3)式可知:为了把彩色图像转换为灰度图像,首先要找出彩色图像的颜色值:R、G、B。然后,通过(3)式计算,即可得出亮度值Y。再令:R=G=B=Y,则得到的新的图像,就是灰度图像。

  对于24位或32位的真彩色图像而言,找出每点的RGB值相对容易。前面介绍了,24位或32位真彩不需调色板,它的图像数据就是实际的RGB的值。RGB三个分量分别占有一个字节,即容易取得RGB的值。

  而对于16位位图言,它的一个点用两个字节来表示。它也不用调色板。要取得RGB的值,就需要了解R、


G、B在这两个字节中的位置。它们所占的位置是这样的:


 


  R占高5位,B占低5位,G占中间6位。

  取出相应的RGB值后,都转变为八位(低位补0)。故取出一个点的RGB值,可采用如下的算法得到R、G、B三个分量的值:

  typedef union tagRGBDATA{

  unsigned int rgb16;

  stuct{

  unsigned B:5;//<<3

  unsigned G:6;//<<2

  unsigned R:5;//<<3

  }Bits16;

  }RGBDATA;

  #define RR16(a)((unsigned char)

  ((((a).Bits 16.R)<<3)&Oxf8))

  #define RG16(a)((unsigned char)

  ((((a).Bits 16.G)<<2)&Oxfc))

  #define RB16(a)((unsigned char)

  ((((a).Bits 16.B)<<3)&Oxf8))

  显然,由上述三个宏定义,容易求得某点的R、G、B三个分量的值。再通过(3)式,即可得到该点的亮度值Y。然后,写回新的256色位图时,令R=G=B=Y,这样,就得到了一个256级的灰度图像。

  图2就是图1通过上述方法变换后的效果图:



图1 灰度化前



图2 灰度化后



  5、结束语

  本文在介绍彩色图像的灰度化处理时,详细介绍了16位位图的灰度化处理方法。此方法灰度化效果好、速度快,并且在图像处理过程中很有实用价值。

 

[时间:2002-12-10  作者:彭召意  来源:中国包装工业]

黄品青微站