yuv 图像格式初探
概述
YUV是一种图像编码方式,或者称为色彩空间,与RGB是同级的概念. YUV是三个分量,Y,U和V,其中:
- Y 表示明亮度(Luminance或Luma),也就是灰度值,
- U,V表示色度,浓度(Chrominance、Chroma),可以简单理解成用来表示某个像素的颜色的量.
YUV格式的特点是,在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。 也就是说,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
其中YCbCr是YUV压缩和偏移的版本。YCbCr的Y与YUV中的Y含义一致,Cb和Cr与UV同样都指色彩,Cb指蓝色色度,Cr指红色色度,在应用上很广泛,JPEG、MPEG、DVD、摄影机、数字电视等皆采此一格式。因此一般俗称的YUV大多是指YCbCr。
YUV采样方式
主流的采样方式有三种: 其中Y 分量用叉表示,UV 分量用圆圈表示。
- YUV4:4:4
- YUV4:2:2
- YUV4:2:0
下面三张图分别为YUV444,YUV422和YUV420的采样方式.
但是注意,上面的三张图只是说明了每个分量的比例,并不能说明排列方式.
需要注意的是yuv420并不是说只采样U分量或者只采样V分量,而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样
YUV封装格式
采样方式主要是告诉我们各个分量的比例,下面看一下封装格式. YUV格式有两大类:planar和packed。
- planar: 先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
- packed: 每个像素点的Y,U,V是连续交错存储的。
其中,planar格式还分为SEMI PLANAR和PLANAR
- semi planar:先连续存储所有的Y, 然后UV交错存储.
- planar:先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
以YUV420为例,前面的图为平面的封装格式,也就是YUV420P(Planar)
后面的图为半平面的封装格式,也就是YUV420SP(semi planar)
或者以1920*1080的图片具体举例:
左边的图为平面的封装格式,也就是YUV420P(Planar)
右边的图为半平面的封装格式,也就是YUV420SP(semi planar)
YUV格式的名称,傻傻分不清楚
由于最近使用的YUV420格式的,因此主要会涉及这一种. YUV420分为YUV420P和YUV420SP两种. 其中YUV420P又有两种,一种是Y(w×h) + U(w×h/4) + V(w×h/4)的格式,这一种也叫I420或者420P或者IYUV(存疑,参考opencv convert_color函数文档) 另一种是Y(w×h) + V(w×h/4) + U(w×h/4)的格式,这一种也叫YV12
YUV420SP也分两种,分别是NV12和NV21. 其中NV12的格式为: Y(w×h) + UV(w×h/4) NV21的格式为: Y(w×h) + VU(w×h/4)
YUV格式转BGR格式
方法有很多,可以直接用公式转. 这里介绍一种借助opencv的比较简单可行的办法 方法是读入时按照二进制文件的方式读入YUV文件, 然后使用opencv的 cvtColor 函数.
1Mat mYUV(height + height/2, width, CV_8UC1, (void*) frameData);
2Mat mRGB(height, width, CV_8UC3);
3cvtColor(mYUV, mRGB, CV_YUV2RGB_YV12, 3);
小结
由于最近遇到的是YUV420的图片格式,所以虽然题目叫YUV格式初探,但是没怎么涉及到其他YUV格式,可能以后有机会补充吧.
放一个表格,懒得一点一点写了,直接贴了其他人博客的截图
参考链接
YUV格式的说明
一文读懂 YUV 的采样与格式
How to read a frame from YUV file in OpenCV?