摘要
弄清楚YUV颜色空间家族。
常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等
YUV与YCbCr关系
YUV 与 YCbCr 两者是等价的。
YUV颜色空间家族
YUV与RGB转换公式
YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!):它讲清楚了为什么网上的YUV与RGB相互转换公式有好多种不同的,因为一方面是量化的考究问题,另一方面是浮点转为整形加速计算的考虑。
注意: 好像即使是量化,对YUV的量化到哪个范围也有好多种,所以公式不太一样。个人觉得,由于大家的转化公式系数都不太一样,RGB2YUV与YUV2RGB需要配套使用。
另外: RGB转YUV_I420时,对UV进行了降采样,把图像分为若干2x2的小块,每个小块共用一个UV,因此,在做YUV_I420转RGB时,同样把图像分为若干2x2的小块,每个小块共用一个UV来恢复RGB。其它降采样格式的YUV同理。
注意: 下面的公式中的RGB,应该已经经过伽马矫正。
方法一
bgr2yuv来自opencv源码:
double y = bgr[2] * 0.299000 + bgr[1] * 0.587000 + bgr[0] * 0.114000;
double u = bgr[2] * -0.168736 + bgr[1] * -0.331264 + bgr[0] * 0.500000 + 128;
double v = bgr[2] * 0.500000 + bgr[1] * -0.418688 + bgr[0] * -0.081312 + 128;
方法二
yuv与rgb相互转换公式,来自opencv源码:
// These functions operate with gamma-corrected images.
// The basic equations for conversion between gamma-corrected RGB(R'G'B')and YUV are:
//
// Y' = 0.299*R' + 0.587*G' + 0.114*B'
// U = -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B' - Y' )
// V = 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R' - Y' )
//
// R' = Y' + 1.140 * V
// G' = Y' - 0.394 * U - 0.581 * V
// B' = Y' + 2.032 * U
//
// For digital RGB values in the range [0 .. 255], Y has a range [0..255],
// U a range [-112 .. +112], and V a range [-157..+157].
//
// These equations are usually scaled to simplify the implementation in an actual
// NTSC or PAL digital encoder or decoder.
用整形加速的公式:
Y = (4899 * R + 9617 * G + 1868 * B) >> 14;
V = ((R - Y) * 14369 + delta) >> 14;
U = ((B - Y) * 8061 + delta) >> 14;
delta = (255 / 2 + 1) * (1 << 14);
方法三
YUV与RGB转换代码
【视频处理】YUV与RGB格式转换:文末给出了各种方法的YUV2RGB时间对比,得到ffmpeg速度最快的结果。
相关/参考链接
《H.264和MPEG-4视频压缩新一代多媒体的视频编码技术》p18
图文详解YUV420数据格式
YUV色彩空间浅析
图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
Recommended 8-Bit YUV Formats for Video Rendering
YUV pixel formats :可以查到YUV各种格式的别称,以及所属的采样类型
YUV色彩格式总结 :YUV采样格式有讲解,并给出RGB到YUV的转换公式
YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别!!!):讲清楚了为什么网上的YUV与RGB相互转换公式有好多种不同的,因为一方面是量化的考究问题,另一方面是浮点转为整形加速计算的考虑。