对于计算机 RGB 输入和8位 BT. 601 YUV 输出,我们相信上一节中给出的公式可以合理地近似如下:
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
这些公式使用不超过8位 (无符号) 精度的系数生成8位结果。 中间结果将要求最高16位的精度。
YUV to RGB888
将8位 YUV 转换为 RGB888
从原始的 RGB 到 YUV 公式,可以为 BT. 601 派生以下关系。
Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
因此,给定:
C = Y - 16
D = U - 128
E = V - 128
用于转换 YUV 到 RGB 的公式可以按如下方式派生:
R = clip( round( 1.164383 * C + 1.596027 * E ) )
G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )
B = clip( round( 1.164383 * C + 2.017232 * D ) )
其中 clip() 表示从0到255的范围进行剪辑。 [ ] 我们相信这些公式可以合理地近似如下:
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
这些公式使用的一些系数需要8个以上的精度才能生成每个8位结果,中间结果要求的精度超过16位。
若要将4:2:0 或 4:2:2 YUV 转换为 RGB,建议将 YUV 数据转换为 4:4:4 YUV,然后再从 4:4:4 YUV 转换为 RGB。 下面的部分提供了一些方法,用于将4:2:0 和4:2:2 格式转换为4:4:4
https://docs.microsoft.com/zh-cn/windows/win32/medfound/recommended-8-bit-yuv-formats-for-video-rendering?redirectedfrom=MSDN#converting-8-bit-yuv-to-rgb888