灰度图Gray Scale Image 或是 Gray Scale Image

1.灰度图Gray Scale Image 定义

Gray Scale Image 或是 Gray Scale Image,56阶。又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为2用灰度表示的图像称作灰度图。
什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
  1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
  2.整数方法:Gray=(R*30+G*59+B*11)/100
  3.移位方法:Gray =(R*76+G*151+B*28)>>8;
  4.平均值法:Gray=(R+G+B)/3;
  5.仅取绿色:Gray=G;
  通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

在嵌入式系统中采用灰度图显示可以显著降低显示RAM容量的要求。


参考链接:

(1)http://baike.baidu.com/view/1184366.htm

(2) http://en.wikipedia.org/wiki/Grayscale


【附】RGB图像的各种格式

RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各各位意义如下:
  高字节 低字节
  R R R R R G G G G G G B B B B B

可以组合使用屏蔽字和移位操作来得到RGB各分量的值:

  #define RGB565_MASK_RED 0xF800
  #define RGB565_MASK_GREEN 0x07E0
  #define RGB565_MASK_BLUE 0x001F
  R = (wPixel & RGB565_MASK_RED) >> 11; // 取值范围0-31
  G = (wPixel & RGB565_MASK_GREEN) >> 5; // 取值范围0-63
  B = wPixel & RGB565_MASK_BLUE; // 取值范围0-31
  #define RGB(r,g,b) (unsigned int)( (r/0x08 << 11) | (g/0x08 << 6) | b/0x08 )
  #define RGB(r,g,b) (unsigned int)( (r/0x08 << 10) | (g/0x08 << 5) | b/0x08 )

该代码可以解决24位与16位相互转换的问题

RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
  高字节 低字节
  X R R R R G G G G G B B B B B (X表示不用,可以忽略)
可以组合使用屏蔽字和移位操作来得到RGB各分量的值:

  #define RGB555_MASK_RED 0x7C00
  #define RGB555_MASK_GREEN 0x03E0
  #define RGB555_MASK_BLUE 0x001F
  R = (wPixel & RGB555_MASK_RED) >> 10; // 取值范围0-31
  G = (wPixel & RGB555_MASK_GREEN) >> 5; // 取值范围0-31
  B = wPixel & RGB555_MASK_BLUE; // 取值范围0-31


RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:
  typedef struct tagRGBTRIPLE { 
  BYTE rgbtBlue; // 蓝色分量
  BYTE rgbtGreen; // 绿色分量
  BYTE rgbtRed; // 红色分量
  } RGBTRIPLE;

参考:网络资料。

你可能感兴趣的:(数据结构,算法,image,struct,嵌入式,byte)