YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma),Y'UV, YUV, YCbCr, YPbPr常常有些混用的情况,其中YUV和Y'UV通常用来描述模拟信号,而相反的YCbCr与YPbPr则是用来描述数位的影像信号,例如在一些压缩格式内MPEG、JPEG中,但在现今,YUV通常已经在电脑系统上广泛使用。YUV Formats分成两个格式:
- 紧缩格式(packed formats):将Y、U、V值储存成Macro Pixels阵列,和RGB的存放方式类似。
- 平面格式(planar formats):将Y、U、V的三个分量分别存放在不同的矩阵中。
紧缩格式(packed format)中的YUV是混合在一起的,对于YUV4:4:4格式而言,用紧缩格式很合适的,因此就有了UYVY、YUYV等。平面格式(planar formats)是指每Y份量,U份量和V份量都是以独立的平面组织的,也就是说所有的U份量必须在Y分量后面,而V份量在所有的U份量后面,此一格式适用于采样(subsample)。平面格式(planar format)有I420(4:2:0)、YV12、IYUV等;
大多数YUV格式平均使用的每像素位数都少于24位元。主要的抽样(subsample)格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法称为A:B:C表示法:
- 4:4:4表示完全取样。
- 4:2:2表示2:1的水平取样,垂直完全采样。
- 4:2:0表示2:1的水平取样,垂直2:1采样。
- 4:1:1表示4:1的水平取样,垂直完全采样。
YUV与RGB的转换公式:
U和V元件可以被表示成原始的R、G,和B:
如一般顺序,转移元件的范围可得到:
在逆转关系上,从YUV到RGB,可得
取而代之,以矩阵表示法(matrix representation),可得到公式:
YUV转RGB[编辑]
function RGB* YUV444toRGB888(Y, U, V);将YUV format移转成简单的RGB format并可以用浮点运算实作:
Y'UV444[编辑]
大多数YUV格式平均使用的每像素位数都少于24位元。YUV444是最逼真的格式,一格不删(24 bits),即每4个Y,配上4个U,还有4个V;YUV422则是在UV格式上减半,即每4个Y,配2个U,2个V;YUV420则是在UV上减至1/4之格式,即每4个Y,配1个U,再配1个V。
这些公式是基于NTSC standard;
在早期的非SIMD(non-SIMD)构造中,floating point arithmetic会比fixed-point arithmetic稍慢,所以有一替代公式如下:
使用前面的系数并且用clip()注明切割的值域是0至255,如下的公式是从Y'UV到RGB (NTSC version):
注意:上述的公式多暗示为YCbCr. 虽然称为YUV,但应该严格区分YUV和YCbCr这两个专有名词有时并非完全相同。
ITU-R版本的公式差异:
ITU-R标准YCbCr(每一通道8位元)至RGB888:
Cr = Cr - 128; Cb = Cb - 128;
Y'UV422[编辑]
- Input:读取Y'UV的4bytes(u, y1, v, y2)
- Output:写入RGB的6bytes(R, G, B, R, G, B)
u = yuv[0]; y1 = yuv[1]; v = yuv[2]; y2 = yuv[3];
以此一资讯可以剖析出regular Y'UV444格式而成为2 RGB pixels info:
rgb1 = Y'UV444toRGB888(y1, u, v); rgb2 = Y'UV444toRGB888(y2, u, v);
Y'UV422可被表达成Y'UY'2 FourCC格式码。意思是2 pixels将被定义成each macropixel (four bytes) treated in the image.
Y'UV411[编辑]
// Extract YUV components u = yuv[0]; y1 = yuv[1]; y2 = yuv[2]; v = yuv[3]; y3 = yuv[4]; y4 = yuv[5];
rgb1 = Y'UV444toRGB888(y1, u, v); rgb2 = Y'UV444toRGB888(y2, u, v); rgb3 = Y'UV444toRGB888(y3, u, v); rgb4 = Y'UV444toRGB888(y4, u, v);
所以结果会得到4 RGB像素的值 (4*3 bytes) from 6 bytes. This means reducing size of transferred data to half and with quite good loss of quality.
YV12[编辑]
The Y'V12的格式相当类似Y'UV420p,但U与V资料反转:Y'跟随着V, U殿后。Y'UV420p与Y'V12使用相同算法。许多重要的编码器都采用YV12空间存储视频:MPEG-4(x264,XviD,DivX),DVD-Video存储格式MPEG-2,MPEG-1以及MJPEG。
将Y'UV420p转换成RGB
Height = 16; Width = 16; Y'ArraySize = Height × Width; //(256) Y' = Array[7 × Width + 5]; U = Array[(7/2) × (Width/2) + 5/2 + Y'ArraySize]; V = Array[(7/2) × (Width/2) + 5/2 + Y'ArraySize + Y'ArraySize/4];
RGB = Y'UV444toRGB888(Y', U, V);