1.YUV基础
yuv是一种类似rgb的颜色模型,起源于黑白和彩电的过渡时期。其中Y代表亮度,uv组合起来可以表示色度。yuv信息只有y的信息就足以显示黑白的图片,yuv和YCbCr表示相同的东西,且Cb严格对应U,Cr严格对应V,yuv和rgb可以通过固定公式进行转换。
yuv转rgb:
yuv转rgb
rgb转yuv:
rgb转yuv
yuv主流的采样方式有yuv4:4:4、yuv4:2:2、yuv4:2:0。下图中以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量,可以看到这些采样方式是影响uv的采样的,对y都是全部采样。
YUV采样方式
YUV 4:4:4采样,每一个Y对应一组UV分量,图像和rgb占用的字小大小一致,均为pixelsize*3。
YUV 4:2:2采样,每两个Y共用一组UV分量,占用的大小为pixelsize+pixelsize/2+pixelsize/2。
YUV 4:2:0采样,每四个Y共用一组UV分量,占用大小为pixelsize+pixelsize/4+pixelsize/4。
可以看到,yuv格式图像信息可以比rgb格式占用的字节码更少,所以可以用yuv来传输色彩数据,接收到yuv数据后再转换为rgb来显示图像,从而减少了传输图像占用的带宽。
2.常见的YUV格式
yuv衍生出了很多格式,主要是由于其存储方式决定的。
yuv按照存储方式可以分成两个大类:
packed:打包格式是将yuv分量混合存在同一个数组中
planar:平面格式是将yuv三个分量存成三个数组或者两个数组分别存储
packed存储的yuv的存储先后不同,细分为了yuv、yvu、yvyu、uyvy等等。
planar存储的yuv依据数组数量分成了yuv分别三个数组表示的完全平面的,以及y一个数组而uv一个数组的半平面(Semi planar)的两类,而半平面的又可以细分为uv和vu两个存储顺序。
常见的yuv格式列表如下:
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP //安卓Camera默认格式
3.操作yuv图像
涉及到摄像头帧图像处理的应用经常需要操作Yuv数据帧,例如镜像、加滤镜等。
操作yuv图像可以直接使用google开源的libyuv库,提供了对yuv图像的格式转换、缩放、裁剪、旋转、镜像等操作:谷歌git libyuv,github上有人用其做了简单的安卓版本的demo:安卓libyuvDemo,包含了基础的yuv库的使用逻辑,但是该项目没有同步谷歌libyuv更新。
参考链接:
[安卓libyuvDemo