Android RGB转YUV的算法
将 ARGB(Alpha-Red-Green-Blue)颜色空间转换为 YUV(亮度-色度)颜色空间的常用算法有以下几种:
矩阵转换法
使用预定义的转换矩阵将 RGB 值转换为 YUV 值。其中,Y 表示亮度,U 和 V 表示色度。这种算法是最基本且常见的 RGB 到 YUV 的转换方法,但结果可能不是最精确的。
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.14713 * R - 0.28886 * G + 0.436 * B
V = 0.615 * R - 0.51499 * G - 0.10001 * B
JPEG 标准法
根据 JPEG 图像压缩标准,使用以下公式将 RGB 值转换为 YUV 值。这种方法相对于矩阵转换法,对 U 和 V 分量进行了偏移和缩放,以适应 YUV 的取值范围。
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.168736 * R - 0.331264 * G + 0.5 * B + 128
V = 0.5 * R - 0.418688 * G - 0.081312 * B + 128
ITU-R BT.601(Rec.601)
根据亮度和色度的感知权重,将RGB图像转换为YUV图像。Y分量表示亮度信息,U和V分量表示色度信息。
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.14713 * R - 0.28886 * G + 0.436 * B
V = 0.615 * R - 0.51499 * G - 0.10001 * B
ITU-R BT.709(Rec.709)
用于高清电视和广播的标准,相较于BT.601,它使用了不同的权重来计算YUV分量。
Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
U = -0.09991 * R - 0.33609 * G + 0.436 * B
V = 0.615 * R - 0.55861 * G - 0.05639 * B
ITU-R BT.2020(Rec.2020)
用于超高清(UHD)和高动态范围(HDR)视频的标准,它提供了更广泛的颜色范围和更准确的色度表示。
Y = 0.2627 * R + 0.6780 * G + 0.0593 * B
U = -0.1396 * R - 0.3604 * G + 0.5000 * B
V = 0.5000 * R - 0.4598 * G - 0.0402 * B
限制范围
黑色对应Y=16,白色对应Y=235,而色度分量的取值相对于完全范围有所缩小
Y:[16,235]
U: [16:240]
V: [16:240]
YUV存储方式