简单讲讲YV12格式

一、YUV格式简介

  YUV是一种颜色编码方式,广义上包括Y'UV、YUV、YCbCr、YPbPr等专有名词,狭义上都称为YUV格式。RGB格式中三个分量R、G、B都表示颜色;YUV格式与之不同,Y分量表示明亮度,也就是灰阶值,U分量和V分量表示的则是色度,用于描述影像色彩及饱和度,用于指定像素的颜色。如果一张YUV图像中只有Y分量而没有UV分量,则这张图像是一张灰度图。

  Cb和Cr分别是蓝色差和红色差。

二、YUV分类

  YUV格式可以根据采样的不同进行分类,也可以根据内存布局的不同进行分类。

2.1 采样

  YUV有三种采样格式,分别是4:4:4和4:2:2和4:1:1(4:2:0),这些采样格式分别代表了Y、U、V分量在采样数量上的比例。对于最后一种采样格式,其实都是表示着4个Y分量和一组UV分量,理论上是4:1:1,不过人们常常称为4:2:0采样格式。

  相比色度,人眼对亮度信息更敏感,可以很明确的看出,上述的采样格式中,亮度Y分量都是满采样的,而色度UV分量则是可以适当丢弃。

  对于4:4:4采样格式,很明显每一个像素点都有其自己的Y、U、V分量。

  对于4:2:2采样格式,可以看出是每个像素点都有自己的Y分量,每两个Y分量共享一组UV分量。但是,具体是哪两个Y分量去共享呢,共享的又是谁的UV分量呢。根据笔者收集的信息,色度样本在水平方向上的采样率是亮度样本的一半,即一行上相邻的两个像素共享一个色度样本对,而这个色度样本对则是相邻两个像素点中第一个像素的UV分量。

  对于4:2:0采样格式,则是每4个Y分量共享一组UV分量。根据笔者收集的信息,通常情况下,色度样本在水平方向上的采样率是亮度样本的一半,而在垂直方向上的采样率也是亮度样本的一半。也就是说4:2:0的采样是一个正方形的采样方式,而共享的色度样本对则是左上角的像素点的UV分量。

2.2 色度编码方式

  YUV还可以根据其色度信息在存储时的位置和顺序不同而进行类型划分。

  首先,根据存储位置,可以分为平面格式(packed)和交错格式(planar)。平面格式指每种分量是存储在不同平面的,也就是分开存储的,比如先存储全部的Y分量,再存储全部的U分量,最后再存储全部的V分量。交错格式是指所有的分量是存储在同一个平面的,以YUV444为例,每个像素点的YUV分量相邻存储。

  除去上面的两种存储格式,还有一种存储位置格式,Semi-Planar,主要用于手机系统,此处不展开。

三、YV12

  YV12是4:2:0采样格式的,是YUV420P的一种。

  YUV420P包括YU12和YV12。他们都是平面格式,第一个平面存储的都是Y分量,但是YV12是先存储V分量平面,再存储U分量平面。

四、YUV与RGB的转换

  RGB转换成YUV的公式如下:

Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V = 0.615 * R - 0.515 * G - 0.100 * B

  YUV转换成RGB的公式如下:

R = Y + 1.402 * (V - 128)
G = Y - 0.344136 * (U - 128) - 0.714136 * (V - 128)
B = Y + 1.772 * (U - 128)

  上面的转换是基于8位采样精度的。一般而言,Y分量是无符号整数,取值范围是0~255;UV分量是有符号整数,取值范围为-128~127。

  对于YV12格式,假设分辨率为width*height,像素点(x,y)的像素分量分别为

Y = width*y + x
U = width*height*5/4 +(y/2 * width/2 + x/2)
V = width*height + (y/2 * width/2 + x/2

  注意,YV12是色度样本在水平方向上的采样率是亮度样本的一半,而在垂直方向上的采样率也是亮度样本的一半。

  

----------------------------------------------------------------------------------------------------------

维基百科:https://en.wikipedia.org/wiki/YUV

posted @ 2023-06-05 20:13  幻cat  阅读(1345)  评论(0编辑  收藏  举报