上一篇我们已经安装并简单学习了H.264的一些基础知识,本节开始记录学习YUV与RGB,以作备忘。同样采用自我总结 + 优秀摘录的方式记录。

RGB介绍 :
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样
<https://www.baidu.com/s?wd=%E5%90%84%E5%BC%8F%E5%90%84%E6%A0%B7&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd>
的颜色。

YUV简介:

YUV的原理是把亮度和色度分离,人眼对亮度的敏感度超过色度。YUV三个字母中,其中”Y”表示明亮度(Lumina
nce或Luma),也就是灰阶值;而”U”和”V”表示的则是色度(Chrominance或Chroma
<https://www.baidu.com/s?wd=Chroma&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd>
),作用是描述影像色彩及饱和度,用于指定像素的颜色。

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


YUV优势:彩色YUV转黑白YUV图像非常简单,该特性用于电视信号上,YUV数据总尺寸小于RGB格式。YUV将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

用三个图(网上截取)来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。 



YUV 4:4:4采样,每一个Y对应一组UV分量。 
YUV 4:2:2采样,每两个Y共用一组UV分量。 
YUV 4:2:0采样,每四个Y共用一组UV分量。

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

查到的转换code:

RGB->YUV:
Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B − Y ) 
Cr = 0.713(R − Y )
代码:
uint8_t COL_RgbToYuv(uint8_t R,uint8_t G,uint8_t B, uint8_t *y,int8_t
*u,int8_t *v)
{
    float rr=R,bb=B,gg=G;
    float yy,uu,vv;
    yy=0.299*rr+ 0.587*gg+ 0.114*bb;
    uu=-0.169*rr+ -0.331*gg+ 0.5*bb;
    vv=0.5*rr+ -0.419*gg+ -0.081*bb;
    if(uu>127) uu=127;
    if(uu-127) uu=-127;
    *u=(int8_t)floor(uu);
    if(vv>127) vv=127;
    if(vv-127) vv=-127;
    *v=(int8_t)floor(vv);
    if(yy>255) yy=255;
    if(yy0) yy=0;
    *y=(uint8_t)floor(yy);
    return 1;
}

YUV->RGB:

R = Y + 1.402Cr
G = Y − 0.344Cb − 0.714Cr 
B = Y + 1.772Cb
代码:
uint8_t COL_YuvToRgb( uint8_t y,int8_t u,int8_t v,uint8_t *r,uint8_t
*g,uint8_t *b)
{
    float rr,bb,gg;
    float yy=y,uu=u,vv=v;
    rr= yy+ 1.402*vv;
    gg= yy+ -0.344*uu+ -0.714*vv;
    bb= yy+ 1.772*uu ;
    #define CLIP(x) if(x>255) x=255; else if (x0) x=0;x=x+0.49;
    #define CVT(x,y) CLIP(x);*y=(uint8_t)floor(x);
    CVT(rr,r);
    CVT(gg,g);
    CVT(bb,b);
    return 1;
}

 

 

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信