一、YUV 介绍
YUV是一种颜色编码方方式,通常由彩色摄像机进行取像,然后把取得的彩色图像信号经过分色、分别放大校正后得到RGB,再经过矩阵变换得到亮度信号Y和两个色差信号B-Y(即U)、R-Y(即V),最后将亮度和色差三个信号分别编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性就是它的亮度信号Y和色度信号U、V是分离的。
YUV 的优点
YUV主要用于优化彩色视频信号的传输。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。
其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
YUV采样
YUV的优点之一是色度通道可以具有比Y通道更低的采样率而不会显着降低感知质量。称为A:B:C符号的符号用于描述U和V相对于Y的采样频率:
- 4:4:4 表示没有对色度通道进行缩减采样。
- 4:2:2 意味着2:1的水平缩减采样,没有垂直下采样。每扫描一行,每两个U或V采样包含四个Y采样。
- 4:2:0 表示2:1水平缩减采样,2:1垂直缩减采样。
- 4:1:1 表示4:1水平缩减采样,没有垂直下采样。每个扫描线对于每个U或V采样包含四个Y采样。4:1:1采样比其他格式少见。
换句话说来说,可以理解为:
- YUV 4:4:4采样,每一个Y对应一组UV分量。
- YUV 4:2:2采样,每两个Y共用一组UV分量。
- YUV 4:2:0采样,每四个Y共用一组UV分量。
YUV存储
下面的图给出了常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。
YUVY 格式 (属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。
UYVY 格式 (属于YUV422)
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
YUV422P(属于YUV422)
YUV422P也属于YUV422的一种,它是一种Plane模式,即打包模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。
YV12,YU12格式(属于YUV420)
NV12、NV21(属于YUV420)
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
yuv420p 和 YUV420的区别
二者在存储格式上有区别:
yuv420p:yyyyyyyy uuuuuuuu vvvvv
yuv420: yuv yuv yuv
YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
二、 YUV格式与RGB格式的换算
关于YUV与RGB转换相关的介绍,可以参见 http://www.fourcc.org/fccyvrgb.php。 下面是转换的时候的标准公式:
RGB 转换成 YUV
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV 转换成 RGB
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)
取值范围
RGB取值范围均为0~255,Y=0~255,U=-122~+122,V=-157~+157
简化后的换算公式
RGB转YUV
Y = 0.299R + 0.587G + 0.114B
U'= (BY)*0.565
V'= (RY)*0.713
YUV转RGB
R = Y + 1.403V'
G = Y - 0.344U' - 0.714V'
B = Y + 1.770U'
三、总结
现在大家应该对几种常见的YUV码流格式就简单地列在上面了,大家在处理YUV码流前,先了解清楚自己的码流到底属于哪一种,然后对应进行处理。
最后,再回答一个疑问,即分析清楚YUV码流格式了,我们可以做什么?最常用的一点就是,提取出所有的Y分量,然后利用vc或者matlab把你采集的图像的灰度(Y分量)显示处理,这样你就可以很快地知道你采集的图像是否有问题了。
四、参考文档
- https://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx
- https://baike.baidu.com/item/YUV/3430784?fr=aladdin
- https://blog.csdn.net/yangyasong/article/details/80681135