我们都知道屏幕上的每个像素点都是由RGBA
组成,R
:red(红)、G
:green(绿)、B
:blue(蓝)、A
:alpha(透明度)。那么YUV
是干什么的呢?
YUV
- 什么是
YUV
?
YUV
是一种颜色编码方法。常使用在各个视频处理组件中。YUV
在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。其中Y
代表亮度(Luminance、Luma),UV
代表色度(Chrominance、Chroma)。 - 为什么要使用YUV颜色编码方式
首先我们先了解RGB颜色编码方式,在图像显示中,一张1280 * 720大小的图片,代表他有1280 * 720个像素点。其中每一个像素点都采用RGB编码方式,每个原色都占用8bit,也就是一个字节,一个像素点就占用24bit,也就是三个字节。所以一张图片占用的存储空间就是:
1280 * 720 * 3 / 1024/ 1024 = 2.63M
YUV
和RGB
类似,每个像素点都包含了三个分量:Y
、U
、V
分量。与RGB
编码不同的是,Y
分量和UV
分量是可以分离的,如果没有UV
分量我们看到的就是一张黑白图片,就像以前的黑白电视机。对于YUV
图像来说,并不是每个像素点,都必须包含UV
分量,没有UV分量我们只是看不到彩色,所以我们可以合理调整UV
分量的采样方式,来达到节约存储空间的目的。Y
分量是负责亮度的,所以Y
分量是每个像素点都必须采样的。
YUV采样格式
- YUV4:4:4
4:4:4
表示Y、U、V三个分量的采样比重一样,所以产生的每个像素点也都是3个字节。与RGB颜色编码没有区别。
原图像:
[y0, u0, v0], [y1, u1, v1], [y2, u2, v2], [y3, u3, v3],....
按YUV4:4:4采样的码流:
y0,u0,v0,y1,u1,v1,y2,u2,v2,y3,u3,v3,...
映射还原的像素点:
[y0, u0, v0], [y1, u1, v1], [y2, u2, v2], [y3, u3, v3],....
- YUV4:2:2
4:2:2
表示Y、U、V三个分量的采样比重。我们知道Y分量我们肯定是每个像素点都会采样,那么UV
分量交叉采样
,就是第一个像素点采样了U分量不采样V分量,第二个像素点就不再采样U分量转为采样V分量。相邻的两个像素点共用一套UV分量
,达到4:2:2
的采样比重。
同样一张1280*720的图片,使用YUV4:2:2
时的大小为:
原图像:
[y0, u0, v0], [y1, u1, v1], [y2, u2, v2], [y3, u3, v3],....
按YUV4:2:2采样的码流:
y0,u0,y1,v1,y2,u2,y3,v3,...
映射还原的像素点:
[y0, u0, v1], [y1, u0, v1], [y2, u2, v3], [y3, u2, v3],....
所占存储空间大小:
(1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2) / 8 / 1024 / 1024 = 1.76 MB
YUV4:2:2图解
- YUV4:2:0
YUV4:2:0
并不是说不采样V分量,而是指,在每一行扫描时,只扫描一种色度分量(U分量或者V分量),与Y分量按照2:1的方式进行采样。比如,第一行扫描时,YU
按照2:1
的方式进行采样,不采样V分量。第二行扫描时,YV
按照2:1
的方式进行采样,不采样U分量,如此交替的进行逐行采样
。就是我们所说的YUV4:2:0
。
同一张1280*720的图像采用YUV4:2:0
采样:
原图像:
[y0, u0, v0], [y1, u1, v1], [y2, u2, v2], [y3, u3, v3]
[y4, u4, v4], [y5, u5, v5], [y6, u6, v6], [y7, u7, v7]
[y8, u8, v8], [y9, u9, v9], [y10, u10, v10], [y11, u11, v11]
[y12, u12, v12], [y13, u13, v13], [y14, u14, v14], [y15, u15, v15]
按YUV4:2:0采样的码流:
y0,u0,y1,y2,u2,y3,y4,v4,y5,y6,v6,y7,y8,u8,y9,y10,u10,y11,y12,v12,y13,y14,v14,y15,...
映射还原的像素点:
[y0, u0, v4], [y1, u0, v4], [y2, u2, v6], [y3, u2, v6]
[y4, u0, v4], [y5, u0, v4], [y6, u2, v6], [y7, u2, v6]
[y8, u8, v12], [y9, u8, v12], [y10, u10, v14], [y11, u10, v14]
[y12, u8, v12], [y13, u8, v12], [y14, u10, v14], [y15, u10, v14]
所占存储空间大小
(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2) / 8 / 1024 / 1024 = 1.32 MB
YUV4:2:0图解
YUV和RGB的转换
显示器都是通过RGB模型
来显示图像的,因为需要节省带宽,我们选择YUV模型
来进行传输。所以我们需要采集图像的时候,先将RGB模型
转换成YUV模型
,在显示的时候再将YUV模型
转换成RGB模型
。
RGB
到YUV
的转换,就是将图像所有像素点的R、G、B
分量量转换到 Y、U、V
分量。RGB
模型和YUV
模型之间的相互转换的公式如下:
-
RGB转换成YUV:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V = 0.615 * R - 0.515 * G - 0.100 * B
-
YUV转RGB
R = Y + 1.14 * V
G = Y - 0.39 * U - 0.58 * V
B = Y + 2.03 * U
网友评论