首先要举办颜色空间的变换

File:      StudyYUV.txt
Name:      深远学习YUV色彩模型
Author:    zyl910
Version:   V1.1
Updata:    2006-5-28

File:      StudyYCbCr.txt
Name:      深刻学习YCbCr色彩模型
Author:    zyl910
Version:   V1.0
Updata:    2006-5-28

由于H.264等压缩算法都是在YUV的水彩空间上开展的,所有在开展削减前,首先要进行颜色空间的转换。若是录像头采集的资源是RGB的,那么首先要转移成YUV,若是是YUV的,那么要根据压缩器具体匡助的YUV格式做多少的重排。本文以RGB24àYUV420(YV12)为例,讲解颜色空间更换的规律。

  近来黑马又对图形学有了兴趣,翻出了多年前读书图形学的笔记,感触良多。于是将它们整理好发了上来。

  近期意料之外又对图形学有了兴趣,翻出了连年前读书图形学的笔记,感触良多。于是将它们整理好发了上来。

多少表达格局

一、基础

一、基础

以320*240的一帧图像为例RGB24的排列方式如下图所示:

  RGB转YUV的更换是那样的:
[Y] = [ 0.299  0.587  0.114]   [R]
[U] = [-0.148 -0.289  0.437] * [G]
[V] = [ 0.615 -0.515 -0.100]   [B]

  RGB转YCbCr的转换是如此的:
[Y ] = [ 0.299   0.587   0.114 ]   [R]   [  0]
[Cb] = [-0.1687 -0.3313  0.5   ] * [G] + [128]
[Cr] = [ 0.5    -0.4187 -0.0813]   [B]   [128]

每个像素点有多少个字节组成分别表示R,G,B分量上的颜色值。在数额中的表示方法为一个像素 一个像素表示。字节流可以发挥如下:

  YUV转RGB的转移是那般的:
[R] = [1  0      1.140]   [Y]
[G] = [1 -0.395 -0.581] * [U]
[B] = [1  2.032  0    ]   [V]

  YCbCr转RGB的变换是这么的:
[R] = [1  0        1.402  ]   [  Y   ]
[G] = [1 -0.34414 -0.71414] * [Cb-128]
[B] = [1  1.772    0      ]   [Cr-128]

BGRBGRBGRBGRBGR……

 

 

|—————320*240*3——-|

二、这个变换周到是如何演绎出来的?

二、那多少个变换全面是如何演绎出来的?

每一个字母代表一个字节,也就是该颜色分量的数值,相邻的多少个BGR字节表示一个像素点。在咱们做计算时,日常三次取八个字节,也就是一个像素点。

  最开端,我是想找一个RGB与YUV转换的短平快算法,于是开头研商它的周全。

  看到“YCbCr转RGB”中总括R、B的这个零没有,把它们不难掉:
R = Y + 1.402*(Cr-128)
B = Y + 1.772*(Cb-128)

相应的YV12的排列形式如下图所示:

2.1 YUV转RGB

  利用“Y = 0.299*R + 0.587*G + 0.114*B”这么些事实来推导G:
G = (Y – 0.299*R – 0.114*B) / 0.587

每个像素点都有一个Y分量,每隔一列就有一个U要么V分量,U和V交替出现。YV12的字节流表示方法和RGB24有很大差异,YV12并不是依据像素依次排列的,而是先放置Y空间,然后放置任何V空间,最终放置U空间,那么字节流如下所示:

  起先以YUV转RGB为突破口。注旨在转移矩阵中有八个0,所以可以去掉一遍乘法:
B = Y + 2.032*U
R = Y + 1.140*V

  将B、R的统计公式代入并化简:
G = {Y – 0.299*[Y + 1.402*(Cr-128)] – 0.114*[Y +
1.772*(Cb-128)]} / 0.587
 = {Y – [0.299*Y + 0.299*1.402*(Cr-128)] – [0.114*Y +
0.114*1.772*(Cb-128)]} / 0.587
 = [(1 – 0.299 – 0.114)*Y – 0.299*1.402*(Cr-128) –
0.114*1.772*(Cb-128)] / 0.587
 = Y – (0.299*1.402 / 0.587)*(Cr-128) – (0.114*1.772 /
0.587)*(Cb-128)
 = Y – 0.714136*(Cr-128) – 0.344136*(Cb-128)

YYYYYYY……VVVV……UUUU……

  利用“Y = 0.299*R + 0.587*G + 0.114*B”这一个谜底来推导G:
G = (Y – 0.299*R – 0.114*B) / 0.587

  现在只是不晓得神奇的1.772、1.402了,将它们代入“RGB转YCbCr”看看:
Cb: 1.772 * [-0.1687 -0.3313  0.5   ] = [-0.2989364 -0.5870636 
0.886    ] ≈ [ -0.299 -0.587 1-0.114]
Cr: 1.402 * [ 0.5    -0.4187 -0.0813] = [ 0.701     -0.5870174
-0.1139826] ≈ [1-0.299 -0.587  -0.114]

|—–320*240—-|-320*240/4-|-320*240/4-|

  将B、R的总括公式代入并化简:
G = [Y – 0.299*(Y + 1.140*V) – 0.114*(Y + 2.032*U)] / 0.587
  = [Y – (0.299*Y + 0.299*1.140*V) – (0.114*Y + 0.114*2.032*U)]
/ 0.587
  = [(Y – 0.299*Y – 0.114*Y)- 0.299*1.140*V – 0.114*2.032*U] /
0.587
  = [(1 – 0.299 – 0.114)*Y – 0.299*1.140*V – 0.114*2.032*U] /
0.587
  = (0.587*Y – 0.299*1.140*V – 0.114*2.032*U) / 0.587
  = Y + (-0.299*1.140*V – 0.114*2.032*U) / 0.587
  = Y – (0.299*1.140 / 0.587)*V – (0.114*2.032 / 0.587)*U
  = Y – (0.114*2.032 / 0.587)*U – (0.299*1.140 / 0.587)*V
  = Y – 0.394630*U – 0.580681*V

  0.5看起来很精晓,大家用 0.5 与 0.299、0.587、0.114
可以推导出那五个常数:
Cb2b * 0.5 = 1-0.114
Cr2R * 0.5 = 1-0.299

在320*240个字节的Y后,紧跟着320*240/4个V和320*240/4个U。

  正好与YUV转RGB的周到符合。
  完整的变换公式:
B = Y + 2.032*U
R = Y + 1.140*V
G = Y – (0.114*2.032 / 0.587)*U – (0.299*1.140 / 0.587)*V

Cb2b = 2*(1-0.114) = 1.772
Cr2R = 2*(1-0.299) = 1.402

YV12和RGB24同样都有320*240个像素点,可是在数据结构和字节流上有着很大不相同。单纯从数量大小来看,RGB24的数码大小为320*240*3Bytes,而YV12为320*240*1.5Bytes,可知YV12的数据量为RGB24的一半。

2.2 RGB转YUV
  从分析YUV转RGB时,大家发现了四个至关首要周到——与U有关的2.032 和
与V有关的1.140。所以大家拿它们去乘RGB转YUV转换矩阵的周密试试:
U: 2.032 * [-0.148 -0.289  0.437] = [-0.300736 -0.587248 
0.887984]
V: 1.140 * [ 0.615 -0.515 -0.100] = [ 0.701100 -0.587100 -0.114000]

  用矩阵总结“RGB转YCbCr”很慢,大家可根据“YCbCr转RGB”逆推:
Cb = (1 / 1.772)*(B – Y) + 128 = [1 / (2*(1-0.114))]*(B – Y) + 128
= (1/2)*[1 / (1-0.114)]*(B – Y) + 128
Cr = (1 / 1.402)*(R – Y) + 128 = [1 / (2*(1-0.299))]*(R – Y) + 128
= (1/2)*[1 / (1-0.299)]*(R – Y) + 128

转换公式

  观看这么些全面,发现有七个特色:
  1.那个负数周到与“彩色转灰度”周详(0.299、0.587、0.114)很相像。
  2.充足正数周到 正好等于 多个负数周到之和的绝对值。

  啊哈!现在精晓 1-0.114、1-0.299 的由来了呢:当 B为1、R和G为0
时,(B-Y) 为 (1-0.114) = 0.886;当 B为0、R和G为1 时,(B-Y) 为 (0-0.886)
= -0.886。所以必要除以(1-0.114)将结果缩放。
  可是,我们一般须要结果在 0~255
那样的字节范围内,所以需求倍加(1/2),再增加128

明白了数码说明方式将来,只要把对应像素点的RGB数值,分别统计成对应的YUV值,然后经过YUV的字节流样式把多少表达出来就能够了,那里,首先介绍一下RGB到YUV转换公式。

  所以我们得以将U、V部分的转换矩阵看成那个样子:
U: (1 / 2.032) * [ -0.299 -0.587 1-0.114]
V: (1 / 1.140) * [1-0.299 -0.587  -0.114]

  所以YCbCr完全是基于 0.299、0.587、0.114 那多少个常数推导出来的。

Y= 0.3*R + 0.59*G + 0.11*B

  完整的更换公式:
[Y] = [   0.299          0.587           0.114       ]   [R]
[U] = [( -0.299)/2.032 (-0.587)/2.032 (1-0.114)/2.032] * [G]
[V] = [(1-0.299)/1.140 (-0.587)/1.140 ( -0.114)/1.140]   [B]

三、整数算法

U= (B-Y) * 0.493

  用矩阵总结“RGB转YUV”很慢,大家可依照“YUV转RGB”逆推:
Y = 0.299*R + 0.587*G + 0.114*B
U = (1 / 2.032)*(B-Y)
V = (1 / 1.140)*(R-Y)

  先将前方的果实列出来。
  RGB转YCbCr:
Y = 0.299*R + 0.587*G + 0.114*B
Cb = (1 / 1.772)*(B – Y) + 128
Cr = (1 / 1.402)*(R – Y) + 128

V= (R-Y) * 0.877

2.3 小结

  YCbCr转RGB:
R = Y + 1.402*(Cr-128)
B = Y + 1.772*(Cb-128)
G = Y – (0.299*1.402 / 0.587)*(Cr-128) – (0.114*1.772 /
0.587)*(Cb-128)

平等反过来,YUV转换成RGB的公式如下:

  所谓的YUV色彩模型是由0.299、0.587、0.114、2.032、1.140那多个数字定义出来的,极度容易、精巧。不过那还不是最精致的,YCbCr完全是由0.299、0.587、0.114那两个数字定义出来的,详见《浓厚学习Ycbcr色彩模型》。

  可以看看,Cb、Cr、R、B
的一个钱打二十四个结就是用乘法缩放数值,完全可以数组查表,甚至老大加减128能够在查表时优化掉。
  至于Y的计算,请参考《彩色转灰度算法彻底学习》
  唯一麻烦一点的是G,因为它有八个乘法,直接整数查表恐怕不精确。所以可以设想将数值缩放65536倍(16位精度)。
  大约是那般:
Y = (R*19595 + G*38469 + B*7472) >> 16
Cb = YCbCr_B2Cb[0x100 + B – Y]
Cr = YCbCr_R2Cr[0x100 + R – Y]

R = Y + 1.14V

 

R = Y + YCbCr_Cr2R[Cr]
B = Y + YCbCr_Cb2B[Cb]
G = Y – ((YCbCr_Cr2G[Cr] + YCbCr_Cb2G[Cb]) >> 16)

G = Y – 0.39U – 0.58V

三、整数算法

B = Y + 2.03U

  先将前方的果实列出来。
  RGB转YUV:
Y = 0.299*R + 0.587*G + 0.114*B
U = (1 / 2.032)*(B-Y)
V = (1 / 1.140)*(R-Y)

代码示例

  YUV转RGB:
B = Y + 2.032*U
R = Y + 1.140*V
G = Y – (0.114*2.032 / 0.587)*U – (0.299*1.140 / 0.587)*V

上面给出了RGB24到YV12(YUV420)的转移代码示例(C++):

  可以看出,U、V、R、B 的计量就是用乘法缩放数值,完全可以数组查表。
  至于Y的计算,请参考《彩色转灰度算法彻底学习》
  唯一麻烦一点的是G,因为它有八个乘法,直接整数查表恐怕不精确。所以可以设想将数值缩放65536倍(16位精度)。
  大约是那般:
Y = (R*19595 + G*38469 + B*7472) >> 16
U = YUV_B2U[0x100 + B – Y]
V = YUV_R2V[0x100 + R – Y]

uint_8_t * pSrc=;// this is RGB bit stream

B = Y + YUV_U2B[0x100 + U]
R = Y + YUV_V2R[0x100 + V]
G = Y – ((YUV_U2G[0x100 + U] + YUV_V2G[0x100 + V]) >> 16)

uint_8_t * YUV_Image=new uint_8[320*240*3/2];// YUV420 bit
stream

 

int i=0,j=0;

int width=320; // width of the RGB image

int height=240; // height of the RGB image

int uPos=0, vPos=0;

for( i=0;i< height;i++ ){

bool isU=false;

if( i%2==0 ) isU=true; // this is a U line

for( j=0;j

int pos = width * i + j; // pixel position

uint_8_t B = pSrc[pos*3];

uint_8_t G = pSrc[pos*3+1];

uint_8_t R = pSrc[pos*3+2];

uint8_t Y= (uint8_t)(0.3*R + 0.59*G + 0.11*B);

uint8_t U= (uint8_t)((B-Y) * 0.493);

uint8_t V= (uint8_t)((R-Y) * 0.877);

YUV_Image[pos] = Y;

bool isChr=false;  // is this a chroma point

if( j%2==0 ) isChr=true;

if( isChr && isU ){

YUV_Image[plane+(plane>>2)+uPos]=U;

}

if( isChr&& !isU ){

YUV_Image[plane+vPos]=V;

}

}

}

【作者: milon】

1 前言

大自然的水彩白云苍狗,为了给颜色一个量化的衡量标准,就必要建立色彩空间模型来讲述各个各种的颜色,由于人对色彩的感知是一个繁杂的生理和思想联合营用
的经过,所以在区其他应用领域中为了更好更标准的满意个其余急需,就出现了丰裕多彩的情调空间模型来量化的叙说颜色。大家相比常接触到的就包涵RGB / CMYK / YIQ / YUV / HSI等等。

对此数字电子多媒体领域来说,大家经常接触到的情调空间的概念,首如若RGB ,
YUV那三种(实际上,这三种系列包罗了诸各个具体的水彩表明格局和模型,如sRGB,
Adobe RGB, YUV422, YUV420 …),
RGB是按三本色加光系统的法则来讲述颜色,而YUV则是按部就班亮度,色差的规律来叙述颜色。

就是只是RGB
YUV这两大类色彩空间,所提到到的知识也是丰富增加复杂的,自知不有所丰富的相干专业知识,所以本文主要针对工程领域的采用及算法举行探讨。

2 YUV相关色彩空间模型

2.1 YUV 与 YIQ YcrCb

对此YUV模型,实际上很多时候,我们是把它和YIQ / YCrCb模型混为一谈的。

实则,YUV模型用于PAL制式的电视机系统,Y表示亮度,UV并非任何单词的缩写。

YIQ模型与YUV模型类似,用于NTSC制式的电视系统。YIQ颜色空间中的I和Q分量相当于将YUV空间中的UV分量做了一个33度的转动。

YCbCr颜色空间是由YUV颜色空间派生的一种颜色空间,主要用来数字电视系统中。从RGB到YCbCr的更换中,输入、输出都是8位二进制格式。

三者与RGB的更换方程如下:

RGB -> YUV:

骨子里也就是:

Y=0.30R+0.59G+0.11B , U=0.493(B-Y) , V=0.877(R-Y)

RGB -> YIQ:

RGB -> YCrCb:

从公式中,我们根本要理解的某些是,UV /
CbCr信号实际上就是褐色差信号和肉色差信号,进而言之,实际上一定水准上直接的表示了黄色和戊辰革命的强度,明白那点对于大家通晓各样颜色变换处理的经过会有很大的援救。

俺们在数字电子多媒体领域所谈到的YUV格式,实际上准确的说,是以YcrCb色彩空间模型为底蕴的富有三种囤积格式的一类颜色模型的家族(包括YUV444 / YUV422 / YUV420 /
YUV420P之类)。并不是传统意义上用以PAL制模拟电视机的YUV模型。那些YUV模型的差别首要在于UV数据的采样格局和仓储格局,那里就不详述。

而在Camera Sensor中,最常用的YUV模型是
YUV422格式,因为它选择4个字节描述八个像素,能和RGB565模型相比好的匹配。有利于Camera
Sensor和Camera controller的软硬件接口设计。

3 YUV2RGB迅速算法分析

此间指的YUV实际是YcrCb了,YUV2RGB的转移公式本身是很简短的,不过牵涉到浮点运算,所以,若是要兑现急速算法,算法结构自身没什么好研商的了,紧即使应用整型运算或者查表来加速总结速度。

第一可以推导得到更换公式为:

R = Y + 1.4075 *(V-128)

G = Y – 0.3455 *(U –128) – 0.7169 *(V –128)

B = Y + 1.779 *(U – 128)

3.1 整型算法

要用整型运算代替浮点运算,当然是要用移位的不二法门了,大家能够很简单取得下列算法:

u = YUVdata[UPOS] – 128;

v = YUVdata[VPOS] – 128;

rdif = v + ((v * 103) >> 8);

invgdif = ((u * 88) >> 8) +((v * 183) >> 8);

bdif = u +( (u*198) >> 8);

r = YUVdata[YPOS] + rdif;

g = YUVdata[YPOS] – invgdif;

b = YUVdata[YPOS] + bdif;

为了幸免出现溢出,还索要判错统计的结果是还是不是在0-255范围内,做类似上面的判断。

if (r>255)

r=255;

if (r<0)

r=0;

要从RGB24转换成RGB565数据还要做运动和或运算:

RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );

RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

3.2 部分查表法

查表法首先可以想到的就是用查表替代上述整型算法中的乘法运算。

rdif = fac_1_4075[u];

invgdif = fac_m_0_3455[u] + fac_m_0_7169[v];

bdif = fac_1_779[u];

此间一起须要4个1维数组,下标从0起始到255,表格共占用约1K的内存空间。uv可以不须要做减128的操作了。在先期总括对应的数组元素的值的时候总括在内就好了。

对此每个像素,部分查表法用查表替代了2次减法运算和4次乘法运算,4次活动运算。不过,如故需求频仍加法运算和6次相比较运算和可能存在的赋值操作,相对第一种艺术运算速度增进并不明确。

3.3 完全查表法

那么是或不是足以由YUV直接查表得到相应的RGB值呢?乍一看就好像不太可能,以最复杂的G的演算为例,因为G与YUV三者都不毫不相关系,所以类似
G=YUV2G[Y][U][V]如此那般的算法,一个三维下标尺寸都为256的数组就必要占用2的24次方约16兆空间,相对是迫于接受的。所以如今大多数都
是使用部分查表法。

而是,如若大家仔细分析就可以发现,对于G我们实在完全没有须要运用三维数组,因为Y只与UV运算的结果相关,与UV的个体非亲非故,所以大家可以运用二次查表的不二法门将G的演算简化为对七个二维数组的查表操作,如下:

G = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ];

而RB本身就只和YU或YV相关,所以这么大家一起须求4个8*8的二维表格,需求占用4乘2的16次方共256K内存。基本可以接受。可是对于手机那样的嵌入式接纳来说,仍旧略有些大了。

愈来愈分析,大家得以看看,因为在二弟大等嵌入式应用上我们最后是要把多少转换成RGB565格式送到LCD屏上出示的,所以,对于RGB三分量来说,我们根本不需求8bit这么高的精度,为了不难和运算的联合起见,对各种分量大家实际上只需要高6bit的多少就丰盛了,所以我们得以进一步把表格改为4个
6*6的二维表格,那样一起只必要占用16K内存!在计算表格元素值的时候仍是可以把最后的溢出判断也先期做完。最终的算法如下:

y = (YUVdata[Y1POS] >> 2);

u = (YUVdata[UPOS] >> 2);

v = (YUVdata[VPOS] >> 2);

r = yv2r_table[ y ][ v ];

g = yig2g_table[ y ][ uv2ig_table[ u ][ v ] ];

b = yu2b_table[ y ][ u ];

RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );

RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

这么相对部分查表法,大家增添了3次活动运算,而越是回落了4次加法运算和6次相比赋值操作。

在测算表格元素数值的时候,要考虑舍入和偏移等因数使得总结的中间结果满意数组下标非负的渴求,要求一定的技艺。

运用完全查表法,相对于第一种算法,最后运算速度可以有比较显著的增强,具体性质能压实多少,要看所在凉台的CPU运算速度和内存存取速度的争持比例。内
存存取速度越快,用查表法带来的属性改良越了然。在本人的PC上测试的结果性能大约能增高35%。而在某ARM平台上测试只增进了约15%。

3.4 进一步的研究

实际,上述算法:

RGBdata[1] =( (r & 0xF8)  | ( g >> 5) );

RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

中的 (r & 0xF8) 和 ( b >> 3)
等运算也统统可以在表格中先期总结出来。其余,YU /
YV的取值实际上不能覆盖满6*6的限定,中间有些点是恒久取不到的无输入,RB的运算也得以考虑用5*5的报表。那几个都可能进一步提升运算的快慢,减
小表格的尺寸。

别的,在嵌入式应用中,要是可能尽量将表格放在高速内存如SRAM中应当比位居SDRAM中进一步能发挥查表法的优势。

4 RGB2YUV ?

现阶段觉得那么些是没办法将3维报表的查表运算化简为2维表格的查表运算了。只可以用一些查表法替代其中的乘法运算。

其它,多数气象下,大家须要的依旧YUV2RGB的变换,因为从Sensor得到的数据一般大家会用YUV数据,别的JPG和MPEG实际上也是基于YUV格式编码的,所以要突显解码后的数码须求的也是YUV2RGB的运算。

以下是从DirectShow中摘要的连锁小说

处理器彩色屏幕显示色彩的原理与多TV视一样,都是使用R(Red)、G(格林)、B(Blue)相加混色的法则:通过发射出三种不一致强
度的电子束,使显示屏内侧覆盖的红、绿、蓝磷光材料发光而暴发色彩。这种色彩的表示方法称为RGB色彩空间表示(它也是多媒体电脑技术中用得最多的一种色
彩空间表示方法)。

根据三本色原理,任意一种色光F都可以用分裂分量的R、G、B三色相加混合而成。

F = r [ R ] + g [ G ] + b [ B ]

里面,r、g、b分别为三本色参加混合的周详。当三本色分量都为0(最弱)时混合为灰色光;而当三本色分量都为k(最强)时混合为白色光。调整r、g、b七个周到的值,可以勾兑出介于藏黑色光和白色光之间的五光十色的色光。


么YUV又从何而来呢?在现世彩色TV系统中,经常使用三管彩色录像机或彩色CCD视频机举行视频,然后把摄得的彩色图像信号经分色、分别放中将正后获得RGB,再经过矩阵变换电路获得亮度信号Y和多少个色差信号R-Y(即U)、B-Y(即V),最终发送端将亮度和色差多个信号分别举行编码,用同一信道发送
出去。那种色彩的表示方法就是所谓的YUV色彩空间表示。

行使YUV色彩空间的机假如它的亮度信号Y和色度信号U、V是分离的。若是只有Y信号分量而从未U、V分量,那么那样表示的图像就是黑白灰度图像。彩色电视运用YUV空间正是为了用亮度信号Y解决彩色电视与黑白电视机的包容难点,使黑白电视也能接过彩色电视机信号。

YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):

Y = 0.299R + 0.587G + 0.114B

U = -0.147R – 0.289G + 0.436B

V = 0.615R – 0.515G – 0.100B

R = Y + 1.14V

G = Y – 0.39U – 0.58V

B = Y + 2.03U

在DirectShow中,常见的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32
等;常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、
YUV411、YUV420等。作为视频媒体类型的救助说明项目(Subtype),它们对应的GUID见表2.3。

表2.3 常见的RGB和YUV格式

GUID    格式描述

MEDIASUBTYPE_RGB1    2色,每个像素用1位表示,需求调色板

MEDIASUBTYPE_RGB4    16色,每个像素用4位表示,要求调色板

MEDIASUBTYPE_RGB8    256色,每个像素用8位代表,要求调色板

MEDIASUBTYPE_RGB565    每个像素用16位表示,RGB分量分别采用5位、6位、5位

MEDIASUBTYPE_RGB555   
每个像素用16位代表,RGB分量都使用5位(剩下的1位不用)

MEDIASUBTYPE_RGB24    每个像素用24位代表,RGB分量各使用8位

MEDIASUBTYPE_RGB32   
每个像素用32位表示,RGB分量各使用8位(剩下的8位不要)

MEDIASUBTYPE_ARGB32   
每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)

MEDIASUBTYPE_YUY2    YUY2格式,以4:2:2情势封装

MEDIASUBTYPE_YUYV    YUYV格式(实际格式与YUY2相同)

MEDIASUBTYPE_YVYU    YVYU格式,以4:2:2方式包装

MEDIASUBTYPE_UYVY    UYVY格式,以4:2:2形式打包

MEDIASUBTYPE_AYUV    带Alpha通道的4:4:4 YUV格式

MEDIASUBTYPE_Y41P    Y41P格式,以4:1:1格局打包

MEDIASUBTYPE_Y411    Y411格式(实际格式与Y41P一样)

MEDIASUBTYPE_Y211    Y211格式

MEDIASUBTYPE_IF09    IF09格式

MEDIASUBTYPE_IYUV    IYUV格式

MEDIASUBTYPE_YV12    YV12格式

MEDIASUBTYPE_YVU9    YVU9格式

下边分别介绍种种RGB格式。

¨
RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述那个媒体类型的格式细节时,寻常会在BITMAPINFOHEADER数据结构前面随着
一个调色板(定义一名目繁多颜色)。它们的图像数据并不是当真的颜料值,而是当前像素颜色值在调色板中的索引。以RGB1(2色位图)为例,比如它的调色板中
定义的二种颜色值依次为0x000000(藏蓝色)和0xFFFFFF(白色),那么图像数据001101010111…(每个像素用1位表示)表示对应各
像素的水彩为:黑黑白白黑白黑白黑白白白…。

¨
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

¨
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;

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

typedef struct tagRGBQUAD {

BYTE    rgbBlue;      // 红色分量

BYTE    rgb格林;     // 黄色分量

BYTE    rgbRed;       // 黑色分量

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

} RGBQUAD;

上面介绍种种YUV格式。YUV格式平日有两大类:打包(packed)格式和平面(planar)格式。前者将YUV分量存放在同一个数组中,日常是多少个相邻的像素组成一个宏像素(macro-pixel);而后人使用多个数组分开存放YUV多少个轻重,就如一个三维平面一样。表2.3中的
YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。(注意:在介绍种种现实格式时,YUV各分量都会蕴藏下标,如Y0、U0、V0代表
第四个像素的YUV分量,Y1、U1、V1表示第三个像素的YUV分量,以此类推。)

¨
YUY2(和YUYV)格式为各类像素保留Y分量,而UV分量在档次方向上每三个像素采样一回。一个宏像素为4个字节,实际表示2个像素。(4:2:2的意趣为一个宏像素中有4个Y分量、2个U分量和2个V分量。)图像数据中YUV分量排列顺序如下:

Y0 U0 Y1 V0    Y2 U2 Y3 V2 …

¨ YVYU格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所差距:

Y0 V0 Y1 U0    Y2 V2 Y3 U2 …

¨ UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所差别:

U0 Y0 V0 Y1    U2 Y2 V2 Y3 …

¨
AYUV格式带有一个Alpha通道,并且为每个像素都提取YUV分量,图像数据格式如下:

A0 Y0 U0 V0    A1 Y1 U1 V1 …

¨
Y41P(和Y411)格式为各类像素保留Y分量,而UV分量在档次方向上每4个像素采样几回。一个宏像素为12个字节,实际表示8个像素。图像数据中YUV分量排列顺序如下:

U0 Y0 V0 Y1    U4 Y2 V4 Y3    Y4 Y5 Y6 Y8 …

¨
Y211格式在档次方向上Y分量每2个像素采样一回,而UV分量每4个像素采样一回。一个宏像素为4个字节,实际表示4个像素。图像数据中YUV分量排列顺序如下:

Y0 U0 Y2 V0    Y4 U4 Y6 V4 …

¨
YVU9格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个4
x
4的宏块,然后每个宏块提取一个U分量和一个V分量。图像数据存储时,首先是整幅图像的Y分量数组,然后就跟着U分量数组,以及V分量数组。IF09格式与YVU9好像。

¨
IYUV格式为各类像素都提取Y分量,而在UV分量的领到时,首先将图像分成若干个2
x 2的宏块,然后每个宏块提取一个U分量和一个V分量。YV12格式与IYUV类似。

¨
YUV411、YUV420格式多见于DV数据中,前者用于NTSC制,后者用于PAL制。YUV411为各种像素都提取Y分量,而UV分量在档次方向上
每4个像素采样三遍。YUV420并非V分量采样为0,而是跟YUV411绝对而言,在档次方向上增强一倍色差采样频率,在笔直方向上以U/V间隔的主意减小
一半色差采样,如图2.12所示。

YV12转化为RGB原理

图片 1

YV12 或者
I420的YUV颜色空间格式转换成RGB颜色空间格式,因为一个YV12像素大小为1.5Byte,一个RGB像素大小为3Byte。所以8个Y+2个U+2个V能转换成8个RGB像素点。

转自:http://blog.csdn.net/tianshide851049708/article/details/38492263

相关文章