zoukankan      html  css  js  c++  java
  • 色彩之RGB和灰阶

           RGB基础:RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216种颜色。

           RGB应用:目前的显示器大都是采用了RGB颜色标准,在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,目前的电脑一般都能显示32位颜色,约有一百万种以上的颜色;在led领域利用三合一点阵全彩技术, 即在一个发光单元里由RGB三色晶片组成全彩像素。随着这一技术的不断成熟,led显示技术会给人们带来更加丰富真实的色彩感受。

           选择RGB的生理原因:RGB三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,分别对黄绿色绿色蓝紫色(或称紫罗兰色)的光最敏感(波长分别为564、534和420纳米),如果辨别黄绿色的细胞受到的刺激略大于辨别绿色的细胞,人的感觉是黄色;如果辨别黄绿色的细胞受到的刺激大大高于辨别绿色的细胞,人的感觉是红色。虽然三种细胞并不是分别对红色、绿色和蓝色最敏感,但这三种光可以分别对三种锥形细胞产生刺激。

           不同的生物眼中辨别颜色的细胞并不相同,例如类眼中有四种分别对不同波长光线敏感的细胞,而一般哺乳动物只有两种,所以对它们来说只有两种原色光。

    既然“三原色的原理不是出于物理原因,而是由于生理原因造成的”,那么前段所说的“用三种原色的光以不同的比例加和到一起,形成各种颜色的光”显然就不大合适。使用三原色并不足以重现所有的色彩,准确地说法应该是“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”只有那些在三原色的色度所定义的颜色三角内的颜色,才可以利用三原色的光以非负量相加混合得到。

          例如,红光与绿光按某种比例复合,对三种锥状细胞刺激后产生的色觉可与眼睛对单纯的黄光的色觉等效。但决不能认为红光与绿光按某种比例复合后生成黄光,或黄光是由红光和绿光复合而成的。三种色光的加,红光加绿光成为黄光,黄光加蓝光成为白光。

           RGB几何表示:颜色通常都是用三种成分来定义的,不仅RGB颜色模型是这样,其它比如CIELABY'UV也是如此。于是便采用三维空间来进行描述,把三种成分的数值当做欧几里得空间中普通笛卡尔坐标系的坐标值。在RGB模型中使用0到1之间的非负数作为立方体的坐标值,将原点(0,0,0)作为黑色,强度值沿坐标轴方向递增到达位于对角线(1,1,1)处的白色。

          一个RGB组合(r,g,b)表示代表一个给定颜色的点在立方体内部、表面或者边上的三维坐标。这种表示方法使得在计算两个颜色相近程度时只需简单计算它们之间的距离:距离越短颜色越接近。如下图表示RGB颜色模型映射到一个立方体上。水平的x轴代表红色,向左增加。y轴代表蓝色,向右下方向增加。竖直的z轴代表绿色,向上增加。原点代表黑色,遮挡在立方体背面。,

           RGB原理:RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。

    有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了。

    红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。

    红、绿、蓝三个颜色通道每种色各分为255阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色。

    RGB 颜色称为加成色,因为您通过将 R、G 和 B 添加在一起(即所有光线反射回眼睛)可产生白色。加成色用于照明光、电视计算机显示器。例如,显示器通过红色、绿色和蓝色荧光粉发射光线产生颜色。绝大多数可视光谱都可表示为红、绿、蓝 (RGB) 三色光在不同比例和强度上的混合。这些颜色若发生重叠,则产生青、洋红和黄。

          RGB语法:( red,green,blue ) 参数red:integer类型,指定颜色中的红色分量强度,有效值在0到255之间;green:integer类型,指定颜色中的绿色分量强度,有效值在0到255之间;blue:integer类型,指定颜色中的蓝色分量强度,有效值在0到255之间返回值Long。函数执行成功时返回由指定分量确定的颜色,用长整数表示。发生错误时返回-1。如果任何参数的值为NULL,RGB()函数返回NULL。

    用法RGB()函数使用下述公式计算表示颜色的长整数:65536 *Blue + 256 * Green+Red其中,Blue代表蓝色分量,Green代表绿色分量,Red代表红色分量。各分量中,数值越小,亮度越低,数值越大,亮度越高。

          RGB格式:对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空同,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。

         由于网页(WEB)是基于计算机浏览器开发的媒体,所以颜色以光学颜色RGB(红、绿、蓝)为主。网页颜色是以16进制代码表示,一般格式为#DEFABC (字母范围从A-F,数字从0-9 );如黑色,在网页代码中便是:#000000(在css编写中可简写为#000)。当颜色代码为#AABB11时,可以简写为#AB1表示,如#135与#113355表示同样的颜色。

         RGB格式简介:RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER数据结构后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。以RGB1(2色位图)为例,比如它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色),那么图像数据001101010111…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…。

    RGB565

    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

    RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:

    高字节 低字节

    X R 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

    RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:

    typedef struct tagRGBTRIPLE {

    BYTE rgbtBlue; // 蓝色分量

    BYTE rgbtGreen; // 绿色分量

    BYTE rgbtRed; // 红色分量

    } RGBTRIPLE;

          每像素24位(比特s per pixel,bpp)编码的 RGB 值:使用三个8位无符号整数(0 到 255)表示红色、绿色和蓝色的强度。这是当前主流的标准表示方法,用于真彩色JPEG或者TIFF等图像文件格式里的通用颜色交换。它可以产生一千六百万种颜色组合,对人眼来说其中很多已经分辨不开。

    下图展示了24 bpp的RGB 立方体的三个“完全饱和”面,它们被展开到了平面上:

    • (0, 0, 0) 是黑色
    • (255, 255, 255) 是白色
    • (255, 0, 0) 是红色
    • (0, 255, 0) 是绿色
    • (0, 0, 255) 是蓝色
    • (255, 255, 0) 是黄色
    • (0, 255, 255) 是青色
    • (255, 0, 255) 是品红


    黄色
    (255,255,0)
    绿色
    (0,255,0)
    青色
    (0,255,255)

    红色
    (255,0,0)
    RGBR.png
    蓝色
    (0,0,255)

    红色
    (255,0,0)
    品红色
    (255,0,255)

           上述定义使用了叫做“全值域” RGB 的约定。颜色值也经常被认为是取值于 0.0 到 1.0 之间,这可以被映射到其他数字编码。

    使用每原色 8-比特的全值域 RGB 可以有 256 级别的白-灰-黑深浅变化,255 个级别的红色、绿色和蓝色(和它们的等量混合)的深浅变化,但是其他色相的深浅变化要少一些。由于gamma校正,256 级别不表示同等间隔的强度。

           作为典型,数字视频的 RGB 不是全值域的。视频 RGB 是有比例和偏移量的约定,即 (16, 16, 16) 是黑色,(235, 235, 235) 是白色。例如,这种比例和偏移量用在了 CCIR 601 的数字 RGB 定义中。在这种模式中有16种基本颜色,它们分别是:

    RGB
    CMYK
    HSV
    颜色代码
    MS-DOS对应代号
    颜色名称

    (255, 0, 255)
    (27, 82, 0, 0)
    (300°, 100%, 100%)
    #FF00FF
    13
    品红色

    (0, 0, 255)
    (88, 77, 0, 0)
    (240°, 100%, 100%)
    #0000FF
    9
    蓝色

    (0, 255, 255)
    (52, 0, 13, 0)
    (180°, 100%, 100%)
    #00FFFF
    11
    青色

    (0, 255, 0)
    (63, 0, 100, 0)
    (120°, 100%, 100%)
    #00FF00
    10
    绿色

    (255, 255, 0)
    (6, 0, 97, 0)
    (60°, 100%, 100%)
    #FFFF00
    14
    黄色

    (255, 0, 0)
    (0, 99, 100, 0)
    (0°, 100%, 100%)
    #FF0000
    12
    红色

    (128, 0, 128)
    (61, 100, 14, 3)
    (300°, 100%, 50%)
    #800080
    5
    紫色

    (0, 0, 128)
    (100, 98, 14, 17)
    (240°, 100%, 50%)
    #000080
    1
    深蓝色

    (0, 128, 128)
    (86, 31, 49, 8)
    (180°, 100%, 50%)
    #008080
    3
    鸭绿色

    (0, 128, 0)
    (87, 24, 100, 13)
    (120°, 100%, 50%)
    #008000
    2
    深绿色

    (128, 128, 0)
    (51, 36, 100, 13)
    (60°, 100%, 50%)
    #808000
    6
    橄榄色

    (128, 0, 0)
    (29, 100, 100, 38)
    (0°, 100%, 50%)
    #800000
    4
    栗色

    (0, 0, 0)
    (75, 68, 67, 90)
    (0°, 0%, 0%)
    #000000
    0
    黑色

    (128, 128, 128)
    (52, 43, 43, 8)
    (0°, 0%, 50%)
    #808080
    8
    灰色

    (192, 192, 192)
    (25, 20, 20, 0)
    (0°, 0%, 75%)
    #C0C0C0
    7
    银色

    (255, 255, 255)
    (0, 0, 0, 0)
    (0°, 0%, 100%)
    #FFFFFF
    15
    白色

    RGB32

    RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB32。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:

    typedef struct tagRGBQUAD {

    BYTE rgbBlue; // 蓝色分量

    BYTE rgbGreen; // 绿色分量

    BYTE rgbRed; // 红色分量

    BYTE rgbReserved; // 保留字节(用作Alpha通道或忽略)

    } RGBQUAD。

    RGB48

         这种模式分配到每种原色16比特,每种颜色可以有65536个色调,是一种专业用的图象编辑显示,如用于Photoshop,可以制作颜色非常精确的图象。

         灰阶简介:1、通常来说,液晶屏幕上人们肉眼所见的一个点,即一个像素,它是由红、绿、蓝(RGB)三个子像素组成的。每一个子像素,其背后的光源都可以显现出不同的亮度级别。而灰阶代表了由最暗到最亮之间不同亮度的层次级别。这中间层级越多,所能够呈现的画面效果也就越细腻。以8bit panel为例,能表现2的8次方,等于256个亮度层次,我们就称之为256灰阶。LCD屏幕上每个像素,均由不同亮度层次的红、绿、蓝组合起来,最终形成不同的色彩点。也就是说,屏幕上每一个点的色彩变化,其实都是由构成这个点的三个RGB子像素的灰阶变化所带来的。

    资料参考:

    1.百度百科,链接:http://baike.baidu.com/view/17423.htmhttp://baike.baidu.com/view/92687.htm

    2.维基百科,链接:http://zh.wikipedia.org/wiki/RGB

  • 相关阅读:
    Postfix邮件服务
    Python
    LVS
    MFS
    Apache
    Zookeeper集群 + Kafka集群 + KafkaOffsetMonitor 监控
    shell 检测安装包
    shell ssh 批量执行
    shell 判断脚本参数
    bzoj 1500 修改区间 splay
  • 原文地址:https://www.cnblogs.com/arthurtang/p/2617974.html
Copyright © 2011-2022 走看看