rgb 订阅
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。 展开全文
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。
信息
外文名
RGB color mode
图像颜色
红、绿、蓝三色
每像素颜色
16777216(256 * 256 * 256)种
原    理
颜色发光
中文名
RGB色彩模式
强度值
0~255
调色板RGB
RGB1、RGB4、RGB8
RGBRGB色彩模式
显示器大都是采用了RGB颜色标准, 在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,电脑一般都能显示32位颜色,有一千万种以上的颜色。 [1]  电脑屏幕上的所有颜色,都由这红色绿色蓝色三种色光按照不同的比例混合而成的。一组红色绿色蓝色就是一个最小的显示单位。屏幕上的任何一个颜色都可以由一组RGB值来记录和表达。因此这红色绿色蓝色又称为三原色光,用英文表示就是R(red)、G(green)、B(blue)。在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。如同2000年到2010年共是11年一样。按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。在led领域利用三合一点阵全彩技术, 即在一个发光单元里由RGB三色晶片组成全彩像素。随着这一技术的不断成熟,led显示技术会给人们带来更加丰富真实的色彩感受。RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于三者亮度之总和,越混合亮度越高,即加法混合。 红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。RGB 颜色称为加成色,因为您通过将 R、G 和 B 添加在一起(即所有光线反射回眼睛)可产生白色。加成色用于照明光、电视和计算机显示器。例如,显示器通过红色、绿色和蓝色荧光粉发射光线产生颜色。绝大多数可视光谱都可表示为红、绿、蓝 (RGB) 三色光在不同比例和强度上的混合。这些颜色若发生重叠,则产生黄、青和紫。对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。网页格式由于网页(WEB)是基于计算机浏览器开发的媒体,所以颜色以光学颜色RGB(红、绿、蓝)为主。网页颜色是以16进制代码表示,一般格式为#DEFABC (字母范围从A-F,数字从0-9 );如黑色,在网页代码中便是:#000000(在css编写中可简写为#000)。当颜色代码为#AABB11时,可以简写为#AB1表示,如#135与#113355表示同样的颜色。RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER数据结构后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。以RGB1(2色位图)为例,比如它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色)…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…。RGB555RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:高字节 低字节X R R R R R G G G G G B B B B B (X表示不用,可以忽略)可以组合使用屏蔽字和移位操作来得到RGB各分量的值:RGB565RGB565使用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各分量的值:该代码可以解决24位与16位相互转换的问题RGB24RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:RGB32RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB24。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:技术特点● 采集计算机VGA输出屏幕、各种非标准相机的输出采集设备、标准或非标的RGB分量信号● 采集的信号种类按照接口可为复合非标准模拟信号,绿路带同步的/行场分离的RGB分量信号● 高分辨率高帧率:1280×1024/40帧;1024×768/60帧;800×600/120帧;● 最高点频可达170M● 支持硬件任意开窗,二级缩放,硬件翻转● 有类似内存映射的功能,多个应用程序/进程可以共享其采集的图像数据;● 信号接入丢失感知,无信号不蓝屏、死机● 硬件控制帧率流量,可在实际使用中和其它采集卡配合,更有效提高PCI带宽的利用● 支持RGB32、RGB24、YUV422、RGB8等采集格式● 全自动行场频检测:具有全自动行场频自适应能力和信号自检测能力,信源端信号的变化不需要用户调节,完全适合无人值守应用●编程完全使用微软提供DirectShow /VFW接口,也可提供基于VC、VB、Delphi等的二次开发包演示程序和源代码,●可使用微软的AmCap,VidCap,Windows Media Encode,Window Movie Maker、第三方提供的LabView等应用软件信号介绍VGA采集卡/RGB信号采集卡可采集VGA信号、标准和非标准RGB分量等信号源,适用于高精度、高分辨率的图像采集、高清VGA视频图像的存储、编码传输等要求。开发工具● 操作系统支持:Windows 2000、XP、Vista、7 linux unix等主流操作系统.● SDK支持:VC、VB、Delphi,提供演示程序及演示程序源代码● 驱动支持:DirectX、OpenCV、LabView、RGB色彩空间根据实际使用设备系统能力的不同,有各种不同的实现方法。截至2006年,最常用的是24-位实现方法,也就是红绿蓝每个通道有8位或者256色级。基于这样的24-位RGB 模型的色彩空间可以表现 256×256×256 ≈ 1670万色。一些实现方法采用每原色16位,能在相同范围内实现更高更精确的色彩密度。这在宽域色彩空间中尤其重要,因为大部分通常使用的颜色排列的相对更紧密。印刷技术的当中的RGB色彩空间主要是指加色法当中的三度色彩空间,通过使用不同强度的三原色,红、绿、蓝色的光线来组合成不同的色彩,就好像说,如果平时我们利用扫描仪从印刷品上扫描图像,原理就是扫描仪阅读了图像上面的红、绿、蓝三色的光亮度,然后把这些量度转换成数据,当显示器收到这些数据的时候就可以按照程序设定转换成制定的红、绿、蓝三原色,其实他们当中是有很多不同颜色的小色块的,由于这些色块的像素非常非常的小而且密密麻麻的,所以我们眼睛没法分辨出来。 [2]  以上颜色为常用的基本颜色。颜色选择器是指利用程序实现R、G、B三色的分配,来实现颜色的选择,利用颜色选择器可以选择出所有的颜色,总共有256*256*256种,同时可以实时的预览颜色,这就使得颜色的选择多种多样,并且非常方便。
收起全文
精华内容
下载资源
问答
  • RGB

    千次阅读 2014-07-24 22:23:00
    RGB RGB ���¼���ԭʼ��ҳ��ӡ RGB_百度百科 1基本简介编辑 简介 RGB 色彩 模式使用 RGB模型 为图像中每一个 像素 的RGB分量分配一个0~255范围内的强度值。RGB ...

    RGB

    RGB

    RGB_百度百科

    1基本简介编辑

    简介

    RGB

    色彩

    模式使用

    RGB模型

    为图像中每一个

    像素

    的RGB分量分配一个0~255范围内的强度值。RGB

    图像

    只使用三种颜色,就可以使它们按照不同的比例混合,在

    屏幕

    上呈现16777216(256 * 256 * 256)种颜色。

    应用

    [1] 

    电脑屏幕上的所有颜色,都由这红色绿色蓝色三种色光按照不同的比例混合而成的。一组红色绿色蓝色就是一个最小的显示单位。屏幕上的任何一个颜色都可以由一组RGB值来记录和表达。

    因此这红色绿色蓝色又称为三原色光,用英文表示就是R(red)、G(green)、B(blue)。

    在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。如同2000年到2010年共是11年一样。

    按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。

    led

    领域利用三合一点阵全彩技术, 即在一个发光单元里由RGB三色晶片组成全彩

    像素

    。随着这一技术的不断成熟,

    led

    显示技术会给人们带来更加丰富真实的

    色彩

    感受。

    原理

    RGB是从

    颜色

    发光的原理来设计定的,通俗点说它的

    颜色

    混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,

    色彩

    相混,而

    亮度

    却等于两者亮度之总和,越混合亮度越高,即加法混合。

    有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在

    软件

    中设定颜色就容易理解了。

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

    红、绿、蓝三个

    颜色通道

    每种色各分为255阶

    亮度

    ,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色数值相同时为无

    色彩

    灰度

    色,而三色都为255时为最亮的白色,都为0时为黑色。

    RGB 颜色称为加成色,因为您通过将 R、G 和 B 添加在一起(即所有光线反射回眼睛)可产生白色。加成色用于

    照明

    光、

    电视

    计算机显示器

    。例如,

    显示器

    通过红色、绿色和蓝色荧光粉发射光线产生颜色。绝大多数可视

    光谱

    都可表示为红、绿、蓝 (RGB) 三色光在不同比例和强度上的混合。这些颜色若发生重叠,则产生青、

    洋红

    和黄。

    2RGB格式编辑

    对一种颜色进行编码的方法统称为“

    颜色空间

    ”或“

    色域

    ”。用最简单的话说,世界上任何一种颜色的“

    颜色空间

    ”都可定义成一个固定的数字或

    变量

    。RGB(红、绿、蓝)只是众多

    颜色空间

    的一种。采用这种编码方法,每种颜色都可用三个

    变量

    来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成

    YUV

    颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑

    显示器

    上显示彩色图形。

    网页格式

    由于网页(

    WEB

    )是基于

    计算机浏览器

    开发的媒体,所以颜色以光学颜色RGB(红、绿、蓝)为主。网页颜色是以16进制代码表示,一般格式为#DEFABC (字母范围从A-F,数字从0-9 );如黑色,在

    网页代码

    中便是:#000000(在

    css

    编写中可简写为#000)。当颜色代码为#AABB11时,可以简写为#AB1表示,如#135与#113355表示同样的颜色。

    格式简介

    RGB1、RGB4、RGB8都是

    调色板

    类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER

    数据结构

    后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前

    像素

    颜色值在

    调色板

    中的索引。以RGB1(2色

    位图

    )为例,比如它的

    调色板

    中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色)…(每个

    像素

    用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…。

    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

    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位相互转换的问题

    RGB24(RGB888)

    RGB24使用24位来表示一个

    像素

    ,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE

    数据结构

    来操作一个

    像素

    ,它的定义为:

    typedef struct tagRGBTRIPLE {

    BYTE rgbtBlue; // 蓝色分量

    BYTE rgbtGreen; // 绿色分量

    BYTE rgbtRed; // 红色分量

    } RGBTRIPLE;

    RGB32(RGB8888)

    RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha

    通道

    或者不用。(ARGB32就是带Alpha

    通道

    的RGB24。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD

    数据结构

    来操作一个像素,它的定义为:

    typedef struct tagRGBQUAD {

    BYTE rgbBlue; // 蓝色分量

    BYTE rgbGreen; // 绿色分量

    BYTE rgbRed; // 红色分量

    BYTE rgbReserved; // 保留字节(用作Alpha

    通道

    或忽略)

    } RGBQUAD。

    3信号获取编辑

    技术特点

    ● 采集

    计算机

    VGA输出屏幕、各种非标准相机的输出采集设备、标准或非标的RGB

    分量信号

    ● 采集的信号种类按照接口可为复合非标准

    模拟信号

    ,绿路带同步的/行场分离的RGB分量信号

    ● 高分辨率高帧率:1280×1024/40帧;1024×768/60帧;800×600/120帧;

    ● 最高点频可达170M

    ● 支持硬件任意开窗,二级缩放,硬件翻转

    ● 有类似内存映射的功能,多个应用程序/进程可以共享其采集的图像数据;

    ● 硬件控制帧率流量,可在实际使用中和其它

    采集卡

    配合,更有效提高PCI

    带宽

    的利用

    ● 支持RGB32、RGB24、YUV422、RGB8等采集格式

    ● 全自动行

    场频

    检测:具有全自动行场频自适应能力和信号自检测能力,信源端信号的变化不需要用户调节,完全适合无人值守应用

    编程

    完全使用

    微软

    提供DirectShow /VFW接口,也可提供基于VC、VB、Delphi等的二次开发包演示程序和源代码,

    ●可使用微软的AmCap,VidCap,Windows Media Encode,Window Movie Maker、第三方提供的LabView等应用

    软件

    信号简介

    VGA采集卡

    /RGB信号采集卡可采集VGA信号、标准和非标准RGB分量等信号源,适用于高精度、高

    分辨率

    的图像采集、高清VGA视频图像的存储、编码传输等要求。

    开发工具

    ● 操作系统支持:Windows 2000、XP、Vista、7 linux unix等主流操作系统.

    ● SDK支持:VC、VB、Delphi,提供演示程序及演示程序源代码!

    ● 驱动支持:DirectX、OpenCV、LabView、

    4色彩空间编辑

    RGB

    色彩

    空间根据实际使用设备系统能力的不同,有各种不同的实现方法。截至2006年,最常用的是24-位实现方法,也就是红绿蓝每个

    通道

    有8位或者256色级。基于这样的24-位RGB 模型的

    色彩

    空间可以表现 256×256×256 ≈ 1670万色。一些实现方法采用每原色16位,能在相同范围内实现更高更精确的

    色彩

    密度。这在宽域

    色彩

    空间中尤其重要,因为大部分通常使用的颜色排列的相对更紧密。

    印刷技术的当中的RGB

    色彩

    空间主要是指加色法当中的三度色彩空间,通过使用不同强度的三原色,红、绿、蓝色的光线来组合成不同的色彩,就好像说,如果平时我们利用扫描仪从印刷品上扫描图像,原理就是扫描仪阅读了图像上面的红、绿、蓝三色的光

    亮度

    ,然后把这些量度转换成数据,当

    显示器

    收到这些数据的时候就可以按照程序设定转换成制定的红、绿、蓝三原色,其实他们当中是有很多不同颜色的小色块的,由于这些色块的

    像素

    非常非常的小而且密密麻麻的,所以我们眼睛没法分辨出来。

    5RGB宏编辑

    #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

    这是个带三个参数的宏,

      首先将r,g,b强制转换成BYTE型,之后g左移8位,b左移16位,并把结果分别强制转换成DWORD型,最后将r,左移8位后的g,还有左移16位后的b三者做按位或,所得的结果强制转换成COLORREF类型。

    [2] 

    TheRGBmacro selects a red, green, blue (RGB) color based on the arguments supplied and the color capabilities of the output device.

    COLORREF RGB( BYTE byRed, BYTE byGreen, BYTE byBlue );

    Return value

    The return value is the resultant RGB color as a

    COLORREF

    value.

    [3] 

    Parameters

    byRed

    The intensity of the red color.

    byGreen

    The intensity of the green color.

    byBlue

    The intensity of the blue color.

    6颜色函数编辑

    RGB

    函数

    执行成功时返回由指定分量确定的颜色,用长整数表示。用于表示一个RGB(红绿蓝)颜色值.

    语法

    RGB (RedAs Integer ,GreenAs Integer ,BlueAs Integer )

    部分

    描述

    red

    必要参数;Integer类型。数值范围从 0 到 255,表示颜色的红色成份。

    green

    必要参数;Integer类型。数值范围从 0 到 255,表示颜色的绿色成份。

    blue

    必要参数;Integer类型。数值范围从 0 到 255,表示颜色的蓝色成份。

    注意: 如果其中有一个参数的值超过 255 ,不会显示任何错误,但这个参数会被当做 255。

    函数说明

    可以接受颜色说明的应用程序的

    方法

    属性

    期望这个说明是一个代表 RGB 颜色值的数值。一个 RGB 颜色值指定红、绿、蓝三原色的相对亮度,生成一个用于显示的特定颜色。

    用法RGB()

    函数

    使用下述公式计算表示颜色的长整数:65536 *Blue + 256 * Green+Red其中,Blue代表蓝色分量,Green代表绿色分量,Red代表红色分量。各分量中,数值越小,

    亮度

    越低,数值越大,亮度越高。

    7常见颜色编辑

    颜色名称 红色值 Red 绿色值 Green 蓝色值 Blue

    黑色

    0

    0

    0

    蓝色

    0

    0

    255

    绿色

    0

    255

    0

    青色

    0

    255

    255

    红色

    255

    0

    0

    洋红色

    255

    0

    255

    黄色

    255

    255

    0

    白色

    255

    255

    255

    8颜色选择器编辑

    颜色选择器是指利用程序实现R、G、B三色的分配,来实现颜色的选择,利用颜色选择器可以选择出所有的颜色,总共有256*256*256种,同时可以实时的预览颜色,这就使得颜色的选择多种多样,并且非常方便。

    posted @ 2014-07-24 22:23 心灵捕手 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • RGB与Lab颜色空间互相转换

    万次阅读 多人点赞 2017-08-17 23:25:17
    RGB与Lab颜色空间互相转换 1.Lab颜色空间 同RGB颜色空间相比(见博客《光与色的故事—颜色模型浅析》),Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来...

    RGB与Lab颜色空间互相转换

     

    1.Lab颜色空间

     

           同RGB颜色空间相比(见博客光与色的故事--颜色空间浅析》),Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示;

     

     

          需要提醒的是,Lab颜色空间比计算机显示器、打印机甚至比人类视觉的色域都要大,表示为 Lab 的位图比 RGB 或 CMYK 位图获得同样的精度要求更多的每像素数据。虽然我们在生活中使用RGB颜色空间更多一些,但也并非Lab颜色空间真的一无所有。例如,在 Adobe Photoshop图像处理软件中,TIFF格式文件中,PDF文档中,都可以见到Lab颜色空间的身影。而在计算机视觉中,尤其是颜色识别相关的算法设计中,rgb,hsv,lab颜色空间混用更是常用的方法。

    两者的区别:

          RGB的是由红色通道(R)、绿色通道(G)、蓝色通道(B)组成的,最亮的红色+最亮的绿色+最亮的蓝色=白色;最暗的红色+最暗的绿色+最暗的蓝色=黑色;而在最亮和最暗之间,相同明暗度的红色+相同明暗度的绿色+相同明暗度的蓝色=灰色。在RGB的任意一个通道内,白和黑表示这个颜色的明暗度。所以,有白色或者灰白色的地方,R、G、B三个通道都不可能是黑色的,因为必须要有R、G、B三个通道来构成这些颜色。
          而LAB不一样,LAB中的明度通道(L)专门负责整张图的明暗度,简单的说就是整幅图的黑白版。a通道和b通道只负责颜色的多少。a通道表示从洋红色(通道里的白色)至深绿色(通道里的黑色)的范围;b表示从焦黄色(通道里的白色)至袅蓝色(通道里的黑色)的范围;a、b通道里的50%中性灰色表示没有颜色,所以越接近灰色说明颜色越少,而且a通道和b通道的颜色没有亮度。这就说明了为什么在a、b通道中红色T恤的轮廓是那么的清晰!因为红色是洋红色+焦黄色组成的。
        总的来说:
          1、适合RGB通道抠的图大部分LAB模式能完成,反之不成立。
          2、任何单一色调背景下,用通道抠有明显颜色区别的部分,用LAB模式很快能完成
          3、LAB模式下对明度(L)通道做任何操作(如锐化、模糊等)不会影响到色相。

    2.RGB转Lab颜色空间

          RGB颜色空间不能直接转换为Lab颜色空间,需要借助XYZ颜色空间,把RGB颜色空间转换到XYZ颜色空间,之后再把XYZ颜色空间转换到Lab颜色空间。

         RGB与XYZ颜色空间有如下关系:

          仔细观察式(1),其中 X = 0.412453 * R +  0.412453 *G+ 0.412453B ;  各系数相加之和为0.950456,非常接近于1,我们知道R/G/B的取值范围为[ 0,255 ],如果系数和等于1,则X的取值范围也必然在[ 0,255 ]之间,因此我们可以考虑等比修改各系数,使其之和等于1,这样就做到了XYZ和RGB在同等范围的映射。这也就是为什么代码里X,Y,Z会分别除以0.950456、1.0、1.088754。

    RGB2Lab关键代码实现:

     

    //RGB2Lab Lab2RGB
    const float param_13 = 1.0f / 3.0f;
    const float param_16116 = 16.0f / 116.0f;
    const float Xn = 0.950456f;
    const float Yn = 1.0f;
    const float Zn = 1.088754f;
    
     float gamma(float x)
      {
    	  return x>0.04045?powf((x+0.055f)/1.055f,2.4f):(x/12.92);
      }; 
    
     void RGB2XYZ(T_U8 R, T_U8 G, T_U8 B, float *X, float *Y, float *Z)  
        {  
    	float RR = gamma(R/255.0);
    	float GG = gamma(G/255.0);
    	float BB = gamma(B/255.0);
    
            *X = 0.4124564f * RR + 0.3575761f * GG + 0.1804375f * BB;  
            *Y = 0.2126729f * RR + 0.7151522f * GG + 0.0721750f * BB;  
            *Z = 0.0193339f * RR + 0.1191920f * GG + 0.9503041f * BB;  
        }  
      
    
    
      void XYZ2Lab(float X, float Y, float Z, float *L, float *a, float *b)  
        {  
            float fX, fY, fZ;  
          
            X /= (Xn);  
            Y /= (Yn);  
            Z /= (Zn);  
          
            if (Y > 0.008856f)  
    	    fY = pow(Y, param_13);  	
            else  
    	    fY = 7.787f * Y + param_16116;  
       
            if (X > 0.008856f)  
                fX = pow(X, param_13);  
            else  
                fX = 7.787f * X + param_16116;  
          
            if (Z > 0.008856)  
                fZ = pow(Z, param_13);  
            else  
                fZ = 7.787f * Z + param_16116;  
    
            *L = 116.0f * fY - 16.0f;
    	*L = *L > 0.0f ? *L : 0.0f;   
            *a = 500.0f * (fX - fY);  
            *b = 200.0f * (fY - fZ);  
        }  
    
    int RGB2Lab(IMAGE_TYPE *bmp_img,float *lab_img)
    {
    	DWORD width,height,index;
    	WORD  biBitCount;
    	T_U8 *dst,*bmp,R,G,B;
    	float X,Y,Z,L,a,b;
    	
    	T_U32 line_byte;
    	T_U16 i,j;
    	
    	BITMAPFILEHEADER bf;
    	BITMAPINFOHEADER bi;
    	
    	memset(&bf, 0, sizeof(bf));
    	memset(&bi, 0, sizeof(bi));
    	
    	bmp = bmp_img;
    	memcpy(&bf,bmp,14);
    	memcpy(&bi,&bmp[14],40);
    	
    	height = bi.biHeight;
    	width  = bi.biWidth;
    	biBitCount = bi.biBitCount;//每一个像素由24 bits表示,即RGB分量每一个分量用8 bits表示
    	line_byte = WIDTHBYTES(width*bi.biBitCount);
    
    	dst = bmp_img+BMPHEADSIZE;
    	
    	for (i = 0; i <height;i++)
    	{
    		for (j = 0;j < width;j++)
    		{
    			index = i*line_byte+3*j;
    			B = dst[index];
    			G = dst[index+1];
    			R = dst[index+2];
    
    			RGB2XYZ(R,G,B,&X,&Y,&Z);
    			XYZ2Lab(X,Y,Z,&L,&a,&b);
    
    			lab_img[index] = L;
    			lab_img[index+1] = a;
    			lab_img[index+2] = b;
    		}
    	}
        
    	return 0;
    
    }

     

    3.Lab转RGB颜色空间   

     

    Lab2RGB关键代码实现:

     

    extern const float param_13;
    extern const float param_16116;
    extern const float Xn;
    extern const float Yn;
    extern const float Zn;
    
     float gamma_XYZ2RGB(float x)
      {
    	  return x>0.0031308?(1.055f*powf(x,(1/2.4f))-0.055):(x*12.92);
      };
    
    void XYZ2RGB(float X, float Y, float Z, unsigned char*R, unsigned char*G, unsigned char*B)  
        {       
    	float RR , GG, BB ;
            RR =  3.2404542f * X - 1.5371385f * Y - 0.4985314f * Z;  
            GG = -0.9692660f * X + 1.8760108f * Y + 0.0415560f * Z;  
            BB =  0.0556434f * X - 0.2040259f * Y + 1.0572252f * Z;  
    
    	RR = gamma_XYZ2RGB(RR);
    	GG = gamma_XYZ2RGB(GG);
    	BB = gamma_XYZ2RGB(BB);
    
            RR = CLIP255(RR*255.0+0.5);
            GG = CLIP255(GG*255.0+0.5);
            BB = CLIP255(BB*255.0+0.5);
    
            *R = (unsigned char)RR;  
            *G = (unsigned char)GG;  
            *B = (unsigned char)BB;  
        }  
          
      void Lab2XYZ(float L, float a, float b, float *X, float *Y, float *Z)  
        {  
    	float fX, fY, fZ;  
          
            fY = (L + 16.0f) / 116.0; 
    	fX = a / 500.0f + fY;
    	fZ = fY - b / 200.0f; 
    
    	if(powf(fY,3.0)>0.008856)
    	    *Y =powf(fY,3.0);
    	else
    	    *Y = (fY-param_16116)/7.787f;
    		
            if (powf(fX,3) > 0.008856)  
                *X = fX * fX * fX;  
            else  
                *X = (fX - param_16116) / 7.787f;  
          
            if (powf(fZ,3.0) > 0.008856)  
                *Z = fZ * fZ * fZ;  
            else  
                *Z = (fZ - param_16116) / 7.787f;  
          
            (*X) *= (Xn);  
            (*Y) *= (Yn);  
            (*Z) *= (Zn); 
        }  
    
    
    int Lab2RGB(IMAGE_TYPE *bmp_img,float *lab_img)
    {
    	DWORD width,height,index;
    	WORD  biBitCount;
    	T_U8 *bmp,R,G,B,*Lab2BMP;
    	float X,Y,Z,L,a,b;
    	
    	T_U32 line_byte;
    	T_U16 i,j;
    	
    	BITMAPFILEHEADER bf;
    	BITMAPINFOHEADER bi;
    
    	FILE *Lab2BMP_fp = fopen("Lab2BMP.bmp","wb");
    	
    	if(NULL == Lab2BMP_fp)
    	{
    		printf("Can't open Lab2BMP.bmp\n");
    		return -1;
    	}
    	
    	memset(&bf, 0, sizeof(bf));
    	memset(&bi, 0, sizeof(bi));
    
    	bmp = bmp_img;
    	memcpy(&bf,bmp,14);
    	memcpy(&bi,&bmp[14],40);
    
    	height = bi.biHeight;
    	width  = bi.biWidth;
    	biBitCount = bi.biBitCount;//每一个像素由24 bits表示,即RGB分量每一个分量用8 bits表示
    	line_byte = WIDTHBYTES(width*bi.biBitCount);
    	
    	fwrite(&bf,sizeof(BITMAPFILEHEADER),1,Lab2BMP_fp);
    	fwrite(&bi,sizeof(BITMAPINFOHEADER),1,Lab2BMP_fp);
    
    
    	Lab2BMP = (T_U8*)malloc(height*line_byte);
    	if (Lab2BMP == NULL)
    	{
    		printf("Can't malloc LabBMP image.\n");
    		return 0;
    	}
    	memset(Lab2BMP,0,height*line_byte);
    
    	
    	for (i = 0; i <height;i++)
    	{
    		for (j = 0;j < width;j++)
    		{
    			index = i*line_byte+3*j;
    			L = lab_img[index];
    			a = lab_img[index+1];
    			b = lab_img[index+2];
    
    			Lab2XYZ(L,a,b,&X,&Y,&Z);
    			XYZ2RGB(X,Y,Z,&R,&G,&B);
    		
    
    			Lab2BMP[index] = B;
    			Lab2BMP[index+1] = G;
    			Lab2BMP[index+2] = R;
    		}
    	}
    
    	fwrite(Lab2BMP, line_byte*height, 1, Lab2BMP_fp);
    	fclose(Lab2BMP_fp);  
        free(Lab2BMP);
        
    	return 0;
    
    }

    4.结果实例

     

    左侧图像是原始图像,右侧图像经过RGB->XYZ->LAB->XYZ->RGB的转换结果图。

     以D65光源下24色卡为例,对比其计算出来的RGB Lab值大小。

    24色在D65光源下sRGB值

     

    标准SRGB转Lab值
    上述Lab转RGB值

    按照上述公式,计算出来的Lab值与EasyRGB和Photoshop计算出来的值比较,与EasyRGB差值比较小。之所以有所差异,是lab计算中选取的参考白点Xn、Yn、Zn以及设备RGB转XYZ的矩阵略有差异。与Photoshop比较,主要差异在于a分量,其他两个分量已经比较接近了。

    常见的参考白点在XYZ颜色空间的坐标为:
    
    Observer 2° (CIE 1931) 10° (CIE 1964) Note
    Illuminant X2 Y2 Z2 X10 Y10 Z10  
    A 109.850 100.000 35.585 111.144 100.000 35.200 Incandescent/tungsten
    B 99.0927 100.000 85.313 99.178; 100.000 84.3493 Old direct sunlight at noon
    C 98.074 100.000 118.232 97.285 100.000 116.145 Old daylight
    D50 96.422 100.000 82.521 96.720 100.000 81.427 ICC profile PCS
    D55 95.682 100.000 92.149 95.799 100.000 90.926 Mid-morning daylight
    D65 95.047 100.000 108.883 94.811 100.000 107.304 Daylight, sRGB, Adobe-RGB
    D75 94.972 100.000 122.638 94.416 100.000 120.641 North sky daylight
    E 100.000 100.000 100.000 100.000 100.000 100.000 Equal energy
    F1 92.834 100.000 103.665 94.791 100.000 103.191 Daylight Fluorescent
    F2 99.187 100.000 67.395 103.280 100.000 69.026 Cool fluorescent
    F3 103.754 100.000 49.861 108.968 100.000 51.965 White Fluorescent
    F4 109.147 100.000 38.813 114.961 100.000 40.963 Warm White Fluorescent
    F5 90.872 100.000 98.723 93.369 100.000 98.636 Daylight Fluorescent
    F6 97.309 100.000 60.191 102.148 100.000 62.074 Lite White Fluorescent
    F7 95.044 100.000 108.755 95.792 100.000 107.687 Daylight fluorescent, D65 simulator
    F8 96.413 100.000 82.333 97.115 100.000 81.135 Sylvania F40, D50 simulator
    F9 100.365 100.000 67.868 102.116 100.000 67.826 Cool White Fluorescent
    F10 96.174 100.000 81.712 99.001 100.000 83.134 Ultralume 50, Philips TL85
    F11 100.966 100.000 64.370 103.866 100.000 65.627 Ultralume 40, Philips TL84
    F12 108.046 100.000 39.228 111.428 100.000 40.353 Ultralume 30, Philips TL83

     D65光源下,常见的RGB转XYZ以及XYZ转RGB矩阵如下表所示:

    RGB Working Space Reference White RGB to XYZ [M] XYZ to RGB [M]-1
    Adobe RGB (1998) D65
     0.5767309  0.1855540  0.1881852
     0.2973769  0.6273491  0.0752741
     0.0270343  0.0706872  0.9911085
     2.0413690 -0.5649464 -0.3446944
    -0.9692660  1.8760108  0.0415560
     0.0134474 -0.1183897  1.0154096
    AppleRGB D65
     0.4497288  0.3162486  0.1844926
     0.2446525  0.6720283  0.0833192
     0.0251848  0.1411824  0.9224628
     2.9515373 -1.2894116 -0.4738445
    -1.0851093  1.9908566  0.0372026
     0.0854934 -0.2694964  1.0912975
    Best RGB D50
     0.6326696  0.2045558  0.1269946
     0.2284569  0.7373523  0.0341908
     0.0000000  0.0095142  0.8156958
     1.7552599 -0.4836786 -0.2530000
    -0.5441336  1.5068789  0.0215528
     0.0063467 -0.0175761  1.2256959
    Beta RGB D50
     0.6712537  0.1745834  0.1183829
     0.3032726  0.6637861  0.0329413
     0.0000000  0.0407010  0.7845090
     1.6832270 -0.4282363 -0.2360185
    -0.7710229  1.7065571  0.0446900
     0.0400013 -0.0885376  1.2723640
    Bruce RGB D65
     0.4674162  0.2944512  0.1886026
     0.2410115  0.6835475  0.0754410
     0.0219101  0.0736128  0.9933071
     2.7454669 -1.1358136 -0.4350269
    -0.9692660  1.8760108  0.0415560
     0.0112723 -0.1139754  1.0132541
    CIE RGB E
     0.4887180  0.3106803  0.2006017
     0.1762044  0.8129847  0.0108109
     0.0000000  0.0102048  0.9897952
     2.3706743 -0.9000405 -0.4706338
    -0.5138850  1.4253036  0.0885814
     0.0052982 -0.0146949  1.0093968
    ColorMatch RGB D50
     0.5093439  0.3209071  0.1339691
     0.2748840  0.6581315  0.0669845
     0.0242545  0.1087821  0.6921735
     2.6422874 -1.2234270 -0.3930143
    -1.1119763  2.0590183  0.0159614
     0.0821699 -0.2807254  1.4559877
    Don RGB 4 D50
     0.6457711  0.1933511  0.1250978
     0.2783496  0.6879702  0.0336802
     0.0037113  0.0179861  0.8035125
     1.7603902 -0.4881198 -0.2536126
    -0.7126288  1.6527432  0.0416715
     0.0078207 -0.0347411  1.2447743
    ECI RGB D50
     0.6502043  0.1780774  0.1359384
     0.3202499  0.6020711  0.0776791
     0.0000000  0.0678390  0.7573710
     1.7827618 -0.4969847 -0.2690101
    -0.9593623  1.9477962 -0.0275807
     0.0859317 -0.1744674  1.3228273
    Ekta Space PS5 D50
     0.5938914  0.2729801  0.0973485
     0.2606286  0.7349465  0.0044249
     0.0000000  0.0419969  0.7832131
     2.0043819 -0.7304844 -0.2450052
    -0.7110285  1.6202126  0.0792227
     0.0381263 -0.0868780  1.2725438
    NTSC RGB C
     0.6068909  0.1735011  0.2003480
     0.2989164  0.5865990  0.1144845
     0.0000000  0.0660957  1.1162243
     1.9099961 -0.5324542 -0.2882091
    -0.9846663  1.9991710 -0.0283082
     0.0583056 -0.1183781  0.8975535
    PAL/SECAM RGB D65
     0.4306190  0.3415419  0.1783091
     0.2220379  0.7066384  0.0713236
     0.0201853  0.1295504  0.9390944
     3.0628971 -1.3931791 -0.4757517
    -0.9692660  1.8760108  0.0415560
     0.0678775 -0.2288548  1.0693490
    ProPhoto RGB D50
     0.7976749  0.1351917  0.0313534
     0.2880402  0.7118741  0.0000857
     0.0000000  0.0000000  0.8252100
     1.3459433 -0.2556075 -0.0511118
    -0.5445989  1.5081673  0.0205351
     0.0000000  0.0000000  1.2118128
    SMPTE-C RGB D65
     0.3935891  0.3652497  0.1916313
     0.2124132  0.7010437  0.0865432
     0.0187423  0.1119313  0.9581563
     3.5053960 -1.7394894 -0.5439640
    -1.0690722  1.9778245  0.0351722
     0.0563200 -0.1970226  1.0502026
    sRGB D65
     0.4124564  0.3575761  0.1804375
     0.2126729  0.7151522  0.0721750
     0.0193339  0.1191920  0.9503041
     3.2404542 -1.5371385 -0.4985314
    -0.9692660  1.8760108  0.0415560
     0.0556434 -0.2040259  1.0572252
    Wide Gamut RGB D50
     0.7161046  0.1009296  0.1471858
     0.2581874  0.7249378  0.0168748
     0.0000000  0.0517813  0.7734287
     1.4628067 -0.1840623 -0.2743606
    -0.5217933  1.4472381  0.0677227
     0.0349342 -0.0968930  1.2884099

    D50光源下常见的RGB转XYZ以及XYZ转RGB矩阵为:

    RGB Working Space Reference White RGB to XYZ [M] XYZ to RGB [M]-1
    Adobe RGB (1998) D50
     0.6097559  0.2052401  0.1492240
     0.3111242  0.6256560  0.0632197
     0.0194811  0.0608902  0.7448387
     1.9624274 -0.6105343 -0.3413404
    -0.9787684  1.9161415  0.0334540
     0.0286869 -0.1406752  1.3487655
    AppleRGB D50
     0.4755678  0.3396722  0.1489800
     0.2551812  0.6725693  0.0722496
     0.0184697  0.1133771  0.6933632
     2.8510695 -1.3605261 -0.4708281
    -1.0927680  2.0348871  0.0227598
     0.1027403 -0.2964984  1.4510659
    Bruce RGB D50
     0.4941816  0.3204834  0.1495550
     0.2521531  0.6844869  0.0633600
     0.0157886  0.0629304  0.7464909
     2.6502856 -1.2014485 -0.4289936
    -0.9787684  1.9161415  0.0334540
     0.0264570 -0.1361227  1.3458542
    CIE RGB D50
     0.4868870  0.3062984  0.1710347
     0.1746583  0.8247541  0.0005877
    -0.0012563  0.0169832  0.8094831
     2.3638081 -0.8676030 -0.4988161
    -0.5005940  1.3962369  0.1047562
     0.0141712 -0.0306400  1.2323842
    NTSC RGB D50
     0.6343706  0.1852204  0.1446290
     0.3109496  0.5915984  0.0974520
    -0.0011817  0.0555518  0.7708399
     1.8464881 -0.5521299 -0.2766458
    -0.9826630  2.0044755 -0.0690396
     0.0736477 -0.1453020  1.3018376
    PAL/SECAM RGB D50
     0.4552773  0.3675500  0.1413926
     0.2323025  0.7077956  0.0599019
     0.0145457  0.1049154  0.7057489
     2.9603944 -1.4678519 -0.4685105
    -0.9787684  1.9161415  0.0334540
     0.0844874 -0.2545973  1.4216174
    SMPTE-C RGB D50
     0.4163290  0.3931464  0.1547446
     0.2216999  0.7032549  0.0750452
     0.0136576  0.0913604  0.7201920
     3.3921940 -1.8264027 -0.5385522
    -1.0770996  2.0213975  0.0207989
     0.0723073 -0.2217902  1.3960932
    sRGB D50
     0.4360747  0.3850649  0.1430804
     0.2225045  0.7168786  0.0606169
     0.0139322  0.0971045  0.7141733
     3.1338561 -1.6168667 -0.4906146
    -0.9787684  1.9161415  0.0334540
     0.0719453 -0.2289914  1.4052427

    参考资料:

    http://www.cnblogs.com/Imageshop/archive/2013/02/02/2889897.html

    http://blog.csdn.net/grafx/article/details/59482320

    http://www.easyrgb.com/en/math.php

    http://www.brucelindbloom.com/

     

     

     

    展开全文
  • 常见的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等

    音视频实践学习

    概述

    RGB色彩模式是工业界的一种颜色标准,是通过对红、绿、蓝三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

    RGB16格式

    RGB16数据格式主要有二种:RGB565RGB555

    • RGB565

    每个像素用16比特位表示,占2个字节,RGB分量分别使用5位、6位、5位。

    //获取高字节的5个bit
    R = color & 0xF800;
    //获取中间6个bit
    G = color & 0x07E0;
    //获取低字节5个bit
    B = color & 0x001F;
    
    • RGB555

    每个像素用16比特位表示,占2个字节,RGB分量都使用5位(最高位不用)。

    //获取高字节的5个bit
    R = color & 0x7C00;
    //获取中间5个bit
    G = color & 0x03E0;
    //获取低字节5个bit
    B = color & 0x001F;
    

    RGB24格式

    RGB24图像每个像素用8比特位表示,占1个字节,注意:在内存中RGB各分量的排列顺序为:BGR BGR BGR ......

    RGB32格式

    RGB32图像每个像素用32比特位表示,占4个字节R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留。注意:在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA ......

    • ARGB32

    本质就是带alpha通道RGB24,与RGB32的区别在与,保留的8个bit用来表示透明,也就是alpha的值。

    在内存中的分量排列顺序如下:

    R = color & 0x0000FF00;
    G = color & 0x00FF0000;
    B = color & 0xFF000000;
    A = color & 0x000000FF;
    

    android平台下的RGB格式

    我们平时在android平台下处理Bitmap的时候,下面的几个参数应该接触的比较多:

    • Bitmap.Config.ALPHA_8

    每个像素用8比特位表示,占1个字节,只有透明度,没有颜色。

    • Bitmap.Config.RGB_565

    每个像素用16比特位表示,占2个字节,RGB分量分别使用5位、6位、5位,上面的图已经有作说明。

    • Bitmap.Config.ARGB_4444

    每个像素用16比特位表示,占2个字节,由4个4位组成,ARGB分量都是4位。

    • Bitmap.Config.ARGB_8888

    每个像素用32比特位表示,占4个字节,由4个8位组成,ARGB分量都是8位。

    注意:java默认使用大端字节序,c/c++默认使用小端字节序android平台下Bitmap.config.ARGB_8888的Bitmap默认是大端字节序,当需要把这个图片内存数据给小端语言使用的时候,就需要把大端字节序转换为小端字节序。例如:java层ARGB_8888传递给jni层使用时,需要把java层的ARGB_8888的内存数据转换为BGRA8888

    分离RGB24像素数据中的R、G、B分量

    先准备一张色彩图:

    使用ffmpeg命令将其转换成rgb格式

    ffmpeg -i 375x375.jpeg -s 375x375 -pix_fmt rgb24 rgb24.rgb
    
    void split_rgb24(char *inputPath, int width, int height) {
        FILE *fp_rgb = fopen(inputPath, "rb+");
        FILE *fp_r = fopen("output_r", "wb+");
        FILE *fp_g = fopen("output_g", "wb+");
        FILE *fp_b = fopen("output_b", "wb+");
    
        unsigned char *data = (unsigned char *) malloc(width * height * 3);
    
        fread(data, 1, width * height * 3, fp_rgb);
        int index = 0;
        for (index = 0; index < width * height * 3; index = index + 3) {
            //R
            fwrite(data + index, 1, 1, fp_r);
            //G
            fwrite(data + index + 1, 1, 1, fp_g);
            //B
            fwrite(data + index + 2, 1, 1, fp_b);
        }
    
        cout << index << endl;
    
        free(data);
        fclose(fp_rgb);
        fclose(fp_r);
        fclose(fp_g);
        fclose(fp_b);
    }
    
    int main() {
    
        split_rgb24("/home/byhook/media/rgb24.rgb", 375, 375);
    
        return 0;
    }
    

    最终我们可以通过雷神提供的工具,来查看分离的R,G,B三个分量的文件

    • R分量图像

    • G分量图像

    • B分量图像

    参考:
    https://baike.baidu.com/item/RGB
    https://blog.csdn.net/leixiaohua1020/article/details/50534150
    https://en.wikipedia.org/wiki/RGBA_color_space

    展开全文
  • 概述本文章会详细的介绍RGB颜色空间与RGB三色中色调、饱和度、亮度之间的关系,最后会介绍HSV颜色空间!一.RGB颜色空间1.起源RGB三原色起源于上世纪初1809年ThomasYoung提出视觉的三原色学说,随后Helmholtz在1824...

    一.概述

    本文章会详细的介绍RGB颜色空间与RGB三色中色调、饱和度、亮度之间的关系,最后会介绍HSV颜色空间!

     

    一.RGB颜色空间

    1. 起源

       RGB三原色起源于上世纪初1809Thomas Young提出视觉的三原色学说,随后Helmholtz1824年也提出了三原色学说即:视网膜存在三种视锥细胞,分别含有对红、绿、蓝三种光线敏感的视色素,当一定波长的光线作用于视网膜时,以一定的比例使三种视锥细胞分别产生不同程度的兴奋,这样的信息传至大脑中枢,就产生某一种颜色的感觉。

    在显示器发明之后,从黑白显示器发展到彩色显示器,人们开始使用发出不同颜色的光的荧光粉(CRT,等离子体显示器),或者不同颜色的滤色片(LCD),或者不同颜色的半导体发光器件(OLED和LED大型全彩显示牌)来形成色彩,无一例外的选择了Red,Green,Blue这3种颜色的发光体作为基本的发光单元。通过控制他们发光强度,组合出了人眼睛能够感受到的大多数的自然色彩。         

    计算机显示彩色图像的时候也不例外,最终显示的时候,要控制一个像素中Red,Green,Blue的值,来确定这个像素的颜色。计算机中无法模拟连续的存储从最暗到最亮的量值,而只能以数字的方式表示。于是,结合人眼睛的敏感程度,使用3个字节(3*8位)来分别表示一个像素里面的Red,Green 和Blue的发光强度数值,这就是常见的RGB格式。我们可以打开画图板,在自定义颜色工具框中,输入r,g,b值,得到不同的颜色。

    2. 概述

    RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。

    RGB空间是生活中最常用的一个颜色显示模型,电视机、电脑的CRT显示器等大部分都是采用这种模型。自然界中的任何一种颜色都可以由红、绿、蓝三种色光混合而成,现实生活中人们见到的颜色大多是混合而成的色彩。

    肉眼可以识别世界上的所有颜色,而RGB几乎可以组合成世界上所有的颜色!

    2. RGB颜色范围

    RGB的每个元素在计算机内存中占用1个字节,1个字节等于8个bit位,所以RGB每个元素的取值范围为:0~256(2的8次方)(从2开始算次方我个人觉得是因为bit位,因为一个bit位可以表示两种状态)

    那么三色组合起来256x256x256=16777216(一千六百七十七万七千二百一十六)种颜色,这么多的颜色几乎可以覆盖世界上所有的颜色!所以平常电视机、电脑屏幕、任何显示仪器都会通过这种RGB颜色空间来显示!

    3. 组合方法

    组合方法是通过互补光的形式来组合成任意颜色的

    例如:

    红色 + 绿色 = 黄色

    如图:

     

    红色 + 绿色 +蓝色 = 白色

    如图:

     

    你也可以调整RGB某一元素的色值来达到不同的颜色组合!

     

    3. RGBA

    RGBA(Alpha),A用于描述三原色的透明度!

    例如:

     

    4. RGB文件存储类型

    RGB色彩空间根据每个分量在计算机中占用的存储字节数分为如下几种类型:

    (1)RGB555

    RGB555是一种16位的RGB格式,各分量都用5位表示,剩下的一位不用。

    高字节 -> 低字节(根据内存大小端)

    XRRRRRGGGGGBBBBB(X代表不用)

    (2)RGB565

    RGB565也是一种16位的RGB格式,但是R占用5位,G占用6位,B占用5位。

    (3)RGB24

    RGB24是一种24位的RGB格式,各分量占用8位,取值范围为0-255。

    (4)RGB32

    RGB32是一种32位的RGB格式,各分量占用8位,剩下的8位作Alpha通道或者不用。

    (5)RGB222

    RGB222是一种8位的RGB格式,各分量占用2bit位,剩下的2bit位不用!

    注意这种格式一般用于灰度图,现在的CRT(阴极射线管)都是彩色RGB模型的CRT,所以在显示灰度图时都是放射RGB颜色模板(荧光粉)来做到显示颜色的,也就是说每个像素点上的荧光粉有三个RGB,所以显示灰度图时也就是单通道的图片时,是通过混合RGB来达到灰度色的!

    还有RGB232,RGB332,RGB233,...

    早期的CRT只能显示黑白照是因为工业水平有限,注意也不一定是黑白色,也有可能是单色,如红色,暗红,紫色,暗紫,只能显示一种颜色!

    5.单通道与多通道

     单通道:

    俗称灰度图,每个像素点只能有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色,可以说灰度是黑与白之间的过渡色!

    注意这个值不是RGB里的任何一个元素,显示设备是直接通过CRT(彩色阴极射线显像管)将单通道里的像素值显示黑白色图像,值越高黑色图越亮,一般灰度值大小不会超过125!

    多通道:

    多通道也就是RGB三原色,每个像素点有三个字节来表示(RGB),分别最大取值范围是0-255,可以组合成千万种颜色。

    图像处理优势对比:

    单通道往往应用于图像处理,因为单通道只有一个像素点(一个字节),所以相比多通道三个字节,处理速度上要尤为的快!

    而且单通道能将图像以灰度形式显示出来,不会影响图像识别,和特征提取!

    多通道以原图的形式将图像展示出来,所以可以提取特征很多,识别率高!

    例如:

     

    多通道也可以组合成灰度图,上面说过,红+绿+蓝=白色,注意这里补充一下,只有在三色相等时才会组合成白色!

     

    例如:

     

    想要达到灰度只要将RGB三色调低一点就可以达到!

    例如:

     

    但是当某一方的值不相同时就会产生其他颜色。

     

    所以三通道想要组合成黑白色(灰度)必须三原色值相同。

    也就是说灰度图不一定是单通道,但是单通道一定是灰度图!

     

    三. 色调、饱和度、亮度

    色调(色相):

      彩色图片中,色调决定彩色图片更加偏于哪一方!

    列如:

     

    我们修改一下色调

    当把色调调低时,颜色更加偏向于红色

     

    当我们把色调调高一点时,颜色更加偏向于绿色

     

    当颜色在调高一点时,颜色更加偏向于蓝色

     

    所以由此可以得出色调是决定一个像素点中的颜色更偏向于哪一方(RGB)

     

    2. 饱和度

    饱和度决定了颜色空间中颜色分量,饱和度越高,说明颜色越深,饱和度越低,说明颜色越浅!

    如图:

    当饱和度为55时,可以发现该颜色空间能显示的颜色分量非常低

     

    当我把饱和度调高一点时,可以发现颜色分量显示的明显要深!

     

    可以与上图形成鲜明的对比。

     

    所以饱和度在颜色空间中是起到一个控制RGB组合色的颜色深度的作用。

     

    3.亮度

     亮度决定颜色空间中颜色的明暗程度!

    如图,亮度设置比较高的时候会发现颜色显示的较为鲜艳

     

    当我们把亮度调低一点时

    会发现颜色会变得非常暗!

     

    所以亮度在颜色空间中起到一个控制RGB组合色的明暗程度的作用。

    下面有个答案是我在知乎上看到的觉得非常适合描述色调(色相)、饱和度、亮度与颜色空间的关系:

     

    1. 明度为0的时候,只有一个点,只能是黑色。没有光,啥都看不见。
    后面我们要让明度是某个不为零的值,才好谈下去。基于这个条件,
    2. 纯度为0的时候,只有一条线,只能是黑白的。没有对比度,就没有彩色。

    3. 纯度也不为0了,才可能出现彩色,至于到底是哪一种颜色,就要看色度了。

     

    不知道大家有没有发现,无论你怎么修改色调,饱和度,亮度,RGB三色值会跟随而变化,其实色调,饱和度,亮度都是通过特定的算法经过计算修改RGB三色而达到的控制颜色效果!

     

    本栏属于图像理论知识不提供任何实践代码!

     

     

    四. HSV颜色空间 (部分地方是参考他人博客的文章,然后根据自己的理解写出来的!)

    1. 起源

    HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

     

    这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

    2. HSV颜色模型介绍

    2.1色调H(Hue

    用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°0°-  359°时颜色会依次变换当角度到达360°时也就是红色,角度也就又回到0°了,所以总共为360°,每变换1°时,色相就会有轻微的变化!如果是顺时针的话这个变换过程会从红色逐渐变换到绿色,在由绿色逐渐变换到蓝色,在由蓝色逐渐变换到红色!逆时针的话就是相反的!

     

    2. 2饱和度 S(Saturation

    饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

     

    2.3明度V(Value

    明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;通常取值范围为0%(黑)到100%(白)。

     

    2.4模型分析:

     

    H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。HSV中每一种颜色的互补色分别相差180度。意思就是说:两种颜色在互补时最大为180°

    例如:

    在HSV模型中红与绿的互补色为黄色,其角度为60°

     

    绿色与蓝色的互补光为青色其角度也为60°

     

    蓝色与红色的互补光为品红色其角度也为60°

     

    那么按逆反的方向来算,绿色到红色的互补光为60°

     

    蓝色到绿色的互补光也为60°

     

    红色到蓝色的互补光也为60°

     

    所以通过以上知识可以知道,红色到到绿色之间的互补光为60°,而绿色到红色之间的互补光也为60°所以每一种颜色的色差是:60°+  60°=  160°

     

    互补光的色差在HSV颜色模型中是这样来算的!

    纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。

    V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。 

    2.5 HSV颜色分析

    HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到浅蓝色,V=1 S=0.4 H=240度。

     

    如图:

     

     一般说来,人眼最大能区分128种不同的色彩,130种色饱和度,23种明暗度。如果我们用16Bit表示HSV的话,可以用7位存放H,4位存放S,5位存放V,即745或者655就可以满足我们的需要了。

     

    由于HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,如Photoshop(在Photoshop中叫HSB)等等,但这也决定了它不适合使用在光照模型中,许多光线混合运算、光强运算等都无法直接使用HSV来实现

     

    RGB颜色空间更加面向于工业,而HSV更加面向于用户,大多数做图像识别这一块的都会运用HSV颜色空间,因为HSV颜色空间表达起来更加直观!

     

     

     

     

     

     

    展开全文
  • RGB888、RGB555、RGB565之间转换
  • RGB Bayer转为RGB

    千次阅读 2018-03-17 16:40:13
    RGB Bayer转为RGBRaw RGB 每个像素只有一种颜色(R、G、B中的一种); RGB 每个像素都有三种颜色,每一个的值在0~255之间; 在手机摄像头的测试过程中,由sensor输出的数据就是Raw data(Raw RGB),经过彩色插值...
  • RGB颜色科普

    千次阅读 2017-11-12 11:29:49
    rgb
  • RAW RGB, Bayer RGBRGB

    千次阅读 2016-06-04 17:05:17
    RAW RGBRGB  摄像头的数据输出格式一般分为CCIR601、CCIR656、RAW RGB等格式,此处说的RGB格式应该就是CCIR601或CCIR656格式。而RAW RGB格式与一般的RGB格式是有区别的。  我们知道,Sensor的感光原理是通过一...
  • RAW RGBRGB

    千次阅读 2017-08-22 14:30:31
    网上关于RGB Raw data的介绍的比较混乱,现整理了一下给大家发出来, 先看看网上的一种说法“摄像头的数据输出格式一般分为CCIR601、CCIR656、RAW RGB等格式,此处说的RGB格式应该就是CCIR601或CCIR656格式。而...
  • 常用颜色RGB

    万次阅读 多人点赞 2018-09-14 15:46:42
    这是我见过的颜色比较清新的颜值表了,果断收藏 常见RGB颜色表: RGBRGBRGB值黑色000#000000黄色2552550#FFFF00浅灰蓝色176224230#B0E0E6象牙黑413633#292421香...
  • RGB888与RGB565

    千次阅读 2019-06-06 16:18:51
    真彩色是指图像中的每个像素值都分成R(红)、G(绿)、B(蓝)三个基色分量,每个基色分量直接...RGB888真彩色,每一色光以8位表示,每个通道各有256级阶调,三色光交互增减,RGB三色光能在一个像素上最高显示24...
  • SLAM RGB-D mapping

    万次阅读 2019-12-14 12:41:35
    RGB-D mapping 3D indoor scene modeling from RGB-D data: a survey K. Chen, YK. Lai and SM. Hu. Computational Visual Media 2015. State of the Art on 3D Reconstruction with RGB-D Cameras K. Hildebrandt a...
  • 下载链接 http://download.csdn.net/detail/liquanfeng9227/9893117 工具可以将RGB888颜色值转换成TFT屏用的RGB565颜色值。
  • RGB565,RGB555, RGB888,RGB32转换

    千次阅读 2013-12-06 08:28:52
    关于RGB565,RGB555, RGB888,RGB32的转换,在我的前一篇博文中我已经介绍过了关于RGB565->RGB888的步骤和思想。  今天上午又研究了一个上午,就谢了下来,希望能给需要帮助的哥们一点小小指导,当然了..也期待着...
  • 常用RGB颜色表

    万次阅读 2017-01-11 16:24:16
    常用RGB颜色表(一) R G B 值 R G B 值 R G B 值 黑色 0 0
  • RGB565 to RGB24, RGB555 & RGB2

    千次阅读 2012-04-04 23:14:16
    #define RGB565_MASK_RED 0xF800 #define RGB565_MASK_GREEN 0x07E0 #define RGB565_MASK_BLUE 0x001F void rgb565_2_rgb24(BYTE *rgb24, WORD rgb565
  • RGB和Raw RGB

    2013-05-12 14:45:37
    摄像头的数据输出格式一般分为CCIR601、CCIR656、RAW RGB等格式,此处说的RGB格式应该就是CCIR601或CCIR656格式。而RAW RGB格式与一般的RGB格式是有区别的。 我们知道,Sensor的感光原理是通过一个一个的感光点...
  • rgb和raw rgb的区别

    千次阅读 2017-08-04 09:20:56
    摄像头的数据输出格式一般分为CCIR601、CCIR656、RAW RGB等格式,此处说的RGB格式应该就是CCIR601或CCIR656格式。而RAW RGB格式与一般的RGB格式是有区别的。  我们知道,Sensor的感光原理是通过一个一个的感光...
  • RGB888转RGB666

    千次阅读 2016-06-14 15:12:00
    内存中的数据排列高位在左,低位在右 RGB888-&gt;RGB666  高 -------低  B[3] B[2] B[1] B[0] B[3] B[2] RGB888 RRRRRRRR GGGGGGGG BBBBBBB RRRRRRRR GGGGGGGG BBBB...
  • For a image is RGB565 format, sometimes we want convert it to RGB888, we can simply extract the RGB. The following is some piece of my co
  • rgb565图像转rgb332

    千次阅读 2018-08-21 10:17:45
    前面我在做一个RTOS单片机系统,LCD图像默认是RGB565格式的,但是我们界面比较多,图片资源多,由于系统flash只有4M 图片过多导致编译出来的系统程序flash.bin超出4M,不利于扩展。 后面就想着压缩图像,我们的...
  • RGB = label2rgb(L)

    2019-01-24 15:18:50
    功能:转换标记矩阵到RGB图像 语法: RGB = label2rgb(L) RGB = label2rgb(L, map) RGB = label2rgb(L, map, zerocolor) RGB = label2rgb(L, map, zerocolor, order) 输入: L为标记矩阵(可由labelmatrix, ...
  • 护眼绿RGB

    万次阅读 2019-06-25 11:09:42
    网上流行护眼色的RGB值分别为: R: 204 G: 232 B: 207 以matlab R2017b ,设置背景色为护眼绿 为例: 预设——>颜色——> 取消勾选 使用系统颜色——> 背景——>RGB——> RGB依次输入 204, ...
  • RGB888格式转换成RGB565

    千次阅读 2018-05-09 11:00:07
    #define RGB8882RGB565(rgb888) ((((rgb888)&amp;0xf80000)&gt;&gt;8)|(((rgb888)&amp;0xfc00)&gt;&gt;5)|(((rgb888)&amp;0xf8)&gt;&gt;3)) void main() { ...
  • Bayer RGBRGB Raw

    千次阅读 2016-05-04 11:28:38
    转自:... 对于SENSOR来说,Bayer RGBRGB Raw两者的图象结构都是BG/GR的 (Bayer pattern说的是COLOR FILTER的结构,分为两种:STD Bayer pattern 与Pair patte
  • Matlab提取图像的RGB分量以及RGB的阈值分割

    万次阅读 多人点赞 2019-05-09 13:50:06
    本教程讲解如何将一副RGB图像,提取出图像的R,G,B分量的图像。如何将图像进行颜色的阈值分割。 原图像 ​ Matlab提取RGB颜色分量: 我们知道,一张RGB图像,对应着一个M xN x3 的三维图像。这里的3代表着R,G,B...
  • RGB888转RGB565 C语言代码

    千次阅读 2018-04-15 09:50:59
    之前做过一个项目,需要把视频格式RGB888转换成RGB565的,算法有很多 下面这个是自己优化过的一些 static int rgb888_to_rgb565(void * psrc, int w, int h, void * pdst) { unsigned char * psrc_temp; ...
  • RGB24互转RGB565

    千次阅读 2015-09-30 18:16:14
    RGB24互转RGB565 width和height为图像的高和宽 24bit RGB888 -> 16bit RGB565 的转换 24ibt RGB888 R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0B7 B6 B5 B4 B3 B2 B1 B0 16bit RGB565 R7 R6 R5 R4 R3 G7 ...
  • 在Matlab中没有图片HSL通道的支持,因此需要自己实现rgb2hsl(R,G,B)和hsl2hsl(H,S,L)函数,进行HSL通道和RGB通道之间的转换: 参考内容:http://zh.wikipedia.org/wiki/HSL 每个颜色向量Color = (ColorR, ColorG...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,213
精华内容 24,485
关键字:

rgb