概述

YUV 色彩空间有点不寻常。 Y 分量决定颜色的亮度(称为亮度或亮度),而 U 和 V 分量决定颜色本身(色度)。 Y 的范围为 0 到 1(或数字格式为 0 到 255),而 U 和 V 的范围为 -0.5 到 0.5(或有符号数字形式为 -128 到 127,或无符号形式为 0 到 255)。一些标准进一步限制了范围,因此越界值表示特殊信息,如同步。

此图像显示了 YUV 颜色立方体的略微倾斜表示,看着黑暗 (Y = 0) 侧。请注意中间是完全黑色的,这是 U 和 V 为零的位置,Y 也是如此。当 U 和 V 接近极限时,您开始看到它们对颜色的影响。

此图像从明亮的一面 (Y = 1) 显示了相同的立方体。在这里,我们在面部中间有明亮的白色,在 U 和 V 也处于极限的角落有非常明亮的颜色。

image-1 image-2 image-1 image-2

这些图像向我们展示了 UV 平面上不同点处的杆,通过 Y 延伸。这使我们能够看到每个 UV 点的颜色如何随着 Y 值的增加或减少而变化。上面的图像都是用免费的光线追踪器 POV-Ray 生成的。

YUV 与 RGB 颜色无损转换

YUV 和 RGB 之间的转换有许多稍微不同的公式。唯一的主要区别是小数点后几位。 CCIR 601 标准(现为 ITU-R 601)指定了正确的系数。由于本人比较懒,没有查过这个spec,并且该文章是从一篇外文翻译过来的,不知道下面的系数对不对。无论如何,我已经将它们用于许多转换而没有明显变色。
这些公式假定 U 和 V 是无符号字节。

//摘录外文网站
R = Y + 1.4075 * (V - 128)
G = Y - 0.3455 * (U - 128) - (0.7169 * (V - 128))
B = Y + 1.7790 * (U - 128)

Y = R *  0.299000 + G *  0.587000 + B *  0.114000
U = R * -0.168736 + G * -0.331264 + B *  0.500000 + 128
V = R *  0.500000 + G * -0.418688 + B * -0.081312 + 128

//在 Keith Jack’s 的书 “Video Demystified” (ISBN 1-878707-09-4) 给出的公式
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)

	 Y = 0.257R + 0.504G + 0.098B + 16
Cr = V = 0.439R - 0.368G - 0.071B + 128
Cb = U = -0.148R - 0.291G + 0.439B + 128

//注意在上面的式子中,RGB 的范围是 [0,255],Y 的范围是 [16,235],UV 的范围是 [16,239]。 如果计算结果超出这个范围就截断处理。

//CCIR 601 定义的转换公式
R = Y + 1.403V
G = Y - 0.344U - 0.714V
B = Y + 1.770U

	 Y = 0.299R + 0.587G + 0.114B
Cr = V = 0.713(R - Y) = 0.500R - 0.419G - 0.081B
Cb = U = 0.564(B - Y) = -0.169R - 0.331G + 0.500B
//RGB 的取值范围是 [0,1]。 Y 的范围是 [0,1], Cr 和 Cb 的范围是 [−0.5,0.5]。


//大家仔细看,这两个来源给出的公式系数有些细微的差别,如果将公式中的 YUV 和RGB的取值范围统一成相同的,计算出的结果也略有不同,但是差异很小,基本上眼睛看出区别来。所以大家不用计较这两个公式的区别。
//如果把 RGB 和YUV 的范围都放缩到 [0,255],那么常用的转换公式是这样的。
R = Y + 1.403 * (V - 128)
G = Y - 0.343 * (U - 128) - 0.714 * (V - 128)
B = Y + 1.770 * (U - 128)
//RGB 到 YUV 的转换公式变化很小,只是VU 的值做了个平移。
	 Y = 0.299R + 0.587G + 0.114B
Cr = V = 0.500R - 0.419G - 0.081B + 128
Cb = U = -0.169R - 0.331G + 0.500B + 128




这些并不是彼此的完美反面。我将尝试做一些实际的数学运算并尽快获得更准确的系数。

混合 YUV 颜色

YUV 格式的颜色之间的混合非常容易,并且不需要转换为其他颜色空间。实际上,在 YUV 中混合与在 RGB 中混合是一样的;只需在组件之间进行插值。

例如,将两种颜色等量混合,结果将是:

(Y1+Y2)/2, (U1+U2)/2, (V1+V2)/2

在 YUV 色彩空间中添加其他颜色

在 YUV 中添加颜色有点棘手。 Y 和 UV 分量需要区别对待,因为它们代表不同的事物。

添加 Y 通道很容易;你只需添加它们。

Y3 = Y1 + Y2.

将 Y 值饱和到 255 或 1.0 可能是个好主意。

添加 U 或 V 通道更为复杂。您必须对两个输入值进行平均。

U3 = (U1 + U2)/2, V3 = (V1 + V2)/2.

U 和 V 也应该饱和。否则,在结合高 Y 值时,多次添加可能会导致异常的颜色失真。

JPEG/JFIF - RGB 转换

JPEG/JFIF 文件将压缩图像存储在类似 YUV 的色彩空间中,该色彩空间使用略有不同的系数转换为 RGB。这些公式是:

R = Y + 1.40200 * (U - 128)
G = Y - 0.34414 * (V - 128) - 0.71414 * (U - 128)
B = Y + 1.77200 * (V - 128)