色彩空间
(资料图)
色彩模型是描述使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。例如三原色光模式(RGB) 和印刷四分色模式(CMYK) 都是色彩模型。不同的色彩模型的差异和优劣不在本文讨论范围之内。本文主要讨论YUV和RGB两种色彩模型的相关知识。rgb(255, 0, 0) 代表纯红色,rgb(0, 255, 0) 代表纯绿色,rgb(0, 0, 255) 代表纯蓝色,而 rgb(255, 255, 0) 代表纯黄色(光学中红色和绿色加法混合会呈现黄色)。
RGB三原色通过 RGB 色彩模型,我们最多能表示出256x256x256=16777216种不同的色值,也就是我们常说的1600万色。如果我们创建一个三维坐标系,三个轴的代表字母由X、Y、Z换成 R、G 和 B,即用 Red 代表X轴,Green代表Y轴,Blue代表Z轴,采用光学加法混色的方式构建这个立方空间的话,就形成了一个基于RGB模型的色彩空间了。RGB三原色立体空间
我们知道通过 rgb(x, y, z)这种方式构建的每一个颜色点,都对应于这个立方体中的某一个点,也就是说每一种颜色都被包含在我们的色彩空间之内。
比如有一个1080p(1920*1080)分辨率、帧率为30帧的视频,如果使用RGB进行存储的话,仅仅一分钟的视频就能达到 (1920*1080*8*30*60)bit(约等于27G)。这明显是不现实的,所以我们需要对视频数据进行压缩。
基于以上两点,所以我们需要一种数据相关性没那么强的颜色编码系统或色彩空间,而YUV正好就是这样,从下面的介绍中我们就会明白。YUV能够方便地编码和传输,并且减少带宽占用和信息出错。YUV图像,从上到下依次为原图、亮度Y、色度U、色度V。
一张色彩艳丽的图片如果存储成YUV格式的话,Y就是这张图的黑白照、UV就是涂上颜色。YUV彩色图像
YUV黑白图像
3.1 YUV图像处理流水线pipelineYUV图像处理流水线
3.2 YUV色度抽样方式常见的YUV图像色度抽样方式有如下三种:YUV 444、YUV 422、YUV420。不同类型之间的主要区别是使用了不同的方式进行U、V分量的采样。YUV采样方式
如上图所示,其中实心黑点表示像素点的Y分量,空心圆圈表示采用该像素点的UV分量。可见:YUV 444:每个Y分量分别对应一个U分量和一个V分量YUV 422:每两个Y分量共用一个U分量和一个V分量YUV 420:每四个Y分量共用一个U分量和一个V分量YUV色度抽样方式
YUV444和RGB颜色模型的图像大小是一样的,并没有节省存储空间。当RGB图像转换为YUV图像时,也是先转换为YUV444采样方式的图像。YUV42和RGB颜色模型图像大小相比,节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。YUV420采样方式,Y平面的信息完全保留,而UV这两个色度平面的信息交错保留,并且精度只有Y平面的一半,最终图像、视频的体积也就少了很多,而画质损失实际是被控制在一个合理的范围内。由此,可得出对于一张1280*720大小的图片,采用YUV420采样比YUV 422、YUV444、RGB采样的图像节省的空间最大,所以现在最常见的就是YUV420采样方式。3.3 YUV的存储方式YUV有packed(打包)和 planar(平面)两种存储方式。packed :packed格式是先连续存储所有的Y分量,然后依次交叉储存U、V分量;planar:planar格式也会先连续存储所有的Y分量,但planar会先连续存储U分量的数据,再连续存储V分量的数据,或者先连续存储V分量的数据,再连续存储U分量的数据;将YUV分量分别存储到矩阵,每一个分量矩阵称为一个平面。3.4 YUV颜色编码格式由于色度抽样方式和存储方式的不同,YUV衍生出很多种格式。注意下文中所述,YUV和YCbCr对应关系,Y对应Y,U对应Cb,V对应Cr。3.4.1基于YUV422采样的格式YUYV格式和UYVY格式采用打包packed存储方式。
YVUV格式YVUV为YUV422采样的存储格式,相邻的两个Y共用其相邻的两个Cb、Cr。对于像素点Y’00、Y’01而言,其Cb、Cr的值均为Cb00、Cr00,其他的像素点YUV取值依此类推。UYVY格式UYVY格式与YVUV不同的是,UV即Cb、Cr排列顺序不一样,还原其每个像素点的YUV值的方法与上面一样。YUV422P格式YUV422P格式,又叫做I422,采用的是平面格式进行存储,先存储所有的Y分量,再存储所有的U分量,再存储所有的V分量。3.4.2.基于YUV420采样的格式YUV420是以平面方式(planar)存储,色度抽样为40的色彩编码格式。其中YUV420P为三平面存储,YUV420SP为两平面存储。常见的yuv格式列表如下:I420: YYYYYYYY UU VV =>YUV420P,主要用来远程传输YV12: YYYYYYYY VV UU =>YUV420P,先Y再V再UYU12: YYYYYYYY UU VV =>YUV420P,先Y再U再VYV12和YU12,分别将Y、U、V打包,依次存储。其中每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y’00、Y’01、 Y’10、Y’11共用Cb00、Cr00,其他依此类推。
NV12: YYYYYYYY UVUV =>YUV420SP //IOS中有的模式
NV21: YYYYYYYY VUVU =>YUV420SP //安卓Camera默认格式
NV12和UV21是一种两平面存储方式,Y为一个平面,交错的UV为另一个平面。提取方式与YU12和YV12类似,即Y’00、Y’01、 Y’10、Y’11共用Cb00、Cr00,其他依此类推。YUV与RGB之间的转换是存在标准的,常见的标准有:
ITU-R BT.601(标清)
ITU-R BT.709(高清)
ITU-R BT.2020(超高清)
不同的标准有不同的转换公式,同时还要区分不同的Color Range。Color Range用于指定RGB分量的取值范围,可分为Full Range(取值范围为0255)和Limited Range(取值范围为16235)。
BT.601, LimitedRange, which is the standard for SDTV(标清数字电视)RGB —> YUV
Y = 0.299R+0.587G+0.114B
V = 0.713(R−Y)=0.500R−0.419G−0.081B
U = 0.564(B−Y)=−0.169R−0.331G+0.500B
YUV —> RGB
R = 1.164Y+1.596V-0.871;
G = 1.164Y-0.813V-0.391U+0.529;
B = 1.164Y+2.018U-1.0729;
BT.601, Full Range
RGB —> YUV
Y = 0.299 * R + 0.587 * G + 0.114 * B
V = -0.169 * R - 0.331 * G + 0.500 * B
U = 0.500 * R - 0.439 * G - 0.081 * B
YUV —> RGB
R = Y + 1.400V - 0.7
G = Y - 0.343U - 0.711V + 0.526
B = Y + 1.765U - 0.883
BT.709,which isthe standard for HDTV(高清电视)
RGB —> YUV
Y = 0.0627 + 0.183 * R + 0.614 * g + 0.062 * b
U = 0.5 - 0.101 * R - 0.339 * g + 0.439 * b
V = 0.5 + 0.439 * R - 0.399 * g - 0.040 * b
YUV —> RGB
R = 1.164Y + 1.739V - 0.97
G = 1.164Y - 0.213U - 0.533V + 0.301
B = 1.164Y + 2.112U - 1.129
接下来,以图像处理课程里面经常会出现的一张图片,作为示例,演示YUV与RGB之间的转换。
1. 从YUV420P图像中提取Y、U、V分量
YUV420P图像
从左往右依次为Y、U、V分量2.将YUV420P图像转换为RGBA8888图像
YUV 图像YUV转换为RGBA8888码字不易,文末“分享”、“收藏”、“赞”和“在看”支持下吧
本号对所有文章陈述的观点均保持中立,文章仅供读者交流学习。资讯、图片来源网络,版权归原作者所有,侵权请联系删除。
喜欢就关注咯!
关注我,回复【交流群】,加入内部技术交流群。
码字不易,“分享”、“收藏”、“赞”和“在看”支持下
审核编辑黄宇