YUV信号:
准确来说,YUV是一种颜色编码方法,而yuv信号是由RGB经过矩阵变换电路(先不用去理它是如何转换的)得到的亮度信号Y和两个色差信号U(blue-Y)、V(red-Y)
屏幕分辨率:
我们经常说屏幕的分辨率:1204x768 等,指的是整个屏幕的有768行像素,每行有1024个像素,如果图像像素为RGB格式(准确来说是RGB888:表示R、G、B各占8个比特位)的话:每个像素由R(red)、G(green)、B(blue)构成,R、G、B各占一个字节,所以一个像素需要3个字节空间,整个屏幕算下来需要:1024x768x3 这么多个字节空间来存储。同理 yuv:每个像素由 Y、U、V构成, Y、U、V 同样各占一个字节。
yuv444:
'444’可以理解为:每四个像素里 y、u、v 的个数比例为 4:4:4,看一下下面四个像素点:
[y0u0v0] [y1u1v1] [y2u2v2] [y3u3v3] // 注意下标由0开始计数 |
注意这里的每个像素的 y、u、v 都是完整的!
再来看一下 yuv422(相信大家应该知道其含义了吧:每四个像素里 y、u、v 的个数比例为 4:2:2),就是说yuv422四个像素里是这样构成的:
[y0u0--] [y1--v1] [y2u2--] [y3--v3] // '-'表示缺省值 |
第一个像素点去掉 u,第二个像素点去掉 v,下一个像素点去掉 u,再下一个像素点去掉v,以此类推;这里,就有人会问了,这样不就会存在色差吗?当然,肯开会存在色差的,但并不明显,一般人眼是无法分辨出来。
映射像素点
什么是映射?为什么要映射?我们知道,要构成一个像素点,对于yuv格式来说,必须要y、u、v来组成。那么对于缺掉u、v的yuv422来说,想要构成完整的yuv就要相邻两个像素之间互相共用,比如:
[y0u0--] [y1--v1] 两个像素映射出来就是:[y0u0v1] [y1u0v1]
[y2u2--] [y3--v3] 两个像素映射出来就是:[y2u2v3] [y3u2v3] |
第一个像素点共用下一个像素掉的v,第二个像素点的共用前一个像素掉的u;
yuv420:
那什么又是yuv420呢?yuv420可不是每四个像素之间y、u、v的个数比例为:4:2:0,它比较复杂一点,因为它是在yuv422基础上然后按照一行一行来取舍的:一行去掉u,一行去掉v。也就是说:假如,第一行全部u去掉,那么第二行的v就全部去掉,而再下一行的u全部去掉,像素存放像下面这样:
yuv444:
第一行:[y00u00v00] [y01u01v01] [y02u02v02] [y03u03v03] [y04u04v04] [y05u05v05] 第二行:[y06u06v06] [y07u07v07] [y08u08v08] [y09u09v09] [y10u10v10] [y11u11v11] yuv422: 第一行:[y00u00---] [y01---v01] [y02u02---] [y03---v03] [y04u04---] [y05---v05] 第二行:[y06---v06] [y07u07---] [y08---v08] [y09u09---] [y10---v10] [y11u11---] yuv420: 第一行:[y00u00---] [y01------] [y02u02---] [y03------] [y04u04---] [y05------] 第二行:[y06---v06] [y07------] [y08---v08] [y09------] [y10---v10] [y11------] 以此类推下去...... |
yuv420反推其映射像素点
既然yuv420是以行来处理的,那么映射时就是相邻两行每两个像素之间来互相共用u、v,比如这样:
yuv420:
第一行:[y00u00---] [y01------] [y02u02---] [y03------] [y04u04---] [y05------] 第二行:[y06---v06] [y07------] [y08---v08] [y09------] [y10---v10] [y11------] |
映射为:
第一行:[y00u00v06] [y01u00v06] [y02u02v08] [y03u02v08] [y04u04v10] [y05u04v10]
第二行:[y06u00v06] [y07u00v06] [y08u02v08] [y09u02v08] [y10u04v10] [y11u04v10] |
映射原理是这样的:一行的两个像素点和相邻下一行的相同位置的两个像素点之间u、v共用,是不是有点晕-_-,打个比方说:第一行的第一二个像素点,和第二行的第一二个像素点(必须是第一二个)之间只会存在一个 u, 一个 v,所以像素点间缺什么就补什么。