在调试cam sensor 的过程中,不可避免的会碰到yuv相关的功能点。调试效果可能需要dump yuv 图,自己做预览需要对yuv进行转换显示等。
这里主要是对yuv的基础概念 、分类标准、采样和存储格式进行一个记录。
本文主要是参考网络上博客,对yuv的知识进行整理记录,附上参考链接。
目录
YUVY -- YUV 422 Packed Interleaved
VYUY -- YUV 422 Packed Interleaved
UYVY -- YUV 422 Packed Interleaved
YUV工具
先介绍一个工具,可以打开各种格式的yuv图,免费好用,附上网址。
什么是YUV
常见的颜色模型中,RGB主要用于电子系统里表达和显示颜色,CMYK印刷四色模式用于彩色印刷,而YUV是被欧洲电视系统所采用的一种颜色编码方法。
使用YUV的优点有两个:
- YUV主要用于优化彩色视频信号传输,向后兼容老式黑白电视,这一特性用在于电视信号上。
- YUV是数据总尺寸小于RGB格式(但用YUV444的话,和RGB888一样都是24bits)
YUV细分的话有Y'UV,YUV,YCbCr,YPbPr等类型,其中YCbCr主要用于数字信号。
YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分, 其实是YUV经过Gamma的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV 家族中, YCbCr 是在计算机系统中应用最多的成员, 其应用领域很广泛,JPEG、MPEG,H264均采用此格式。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异,此即所谓的色差信号。
其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量,是标准 YUV 的一个翻版。
一般所讲的YUV大多是指YCbCr。以下用YUV指代YCbCr。
同一幅画的彩色画面,Y分量、V分量、U分量
YUV的采样、分类、存储格式
分类
采样
YUV的采样有许多种,常用的有444,422,420等。由于人眼对 Y 的敏感度远超于对 U 和 V 的敏感,所以有时候可以多个 Y 分量共用一组 UV,这样既可以极大得节省空间,又可以不太损失质量。
按照数据量从小到大依次是YUV 420,YUV 422,YUV 444。
用三个图来直观地表示采集的方式,黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
- YUV 4:4:4采样,每一个Y对应一组UV分量。
4:4:4 Formats, 24 Bits per Pixel
全部数据量 size = w*h*3,不节省空间
- YUV 4:2:2采样,每两个Y共用一组UV分量。
4:2:2 Formats, 16 Bits per Pixel
全部数据量 size = w*h*2,相比yuv444 节省1/3空间
- YUV 4:2:0采样,每四个Y共用一组UV分量。
4:2:0 Formats, 12 Bits per Pixel
全部数据量 size = w*h*1.5,相比yuv444 节省1/2空间
基本存储格式
存储格式可以分为三大类:
- Planar: YUV 三个分量分开存放,先存全部的Y,然后是全部的 U(V),然后是全部的 V(U)。
- Packed: YUV 三个分量全部交错存放,YUV这样,依次存放
- Semi Planar: Y 分量单独存放,UV 分量交错存放,先存全部的Y,剩下的UV交错存放。
- 结合了前两种方式的特点,Y分量分开存,UV交错存放
packed YUV422
每2个连续的Y分量公用一个UV空间,YUV 交错存储。
UYVY422(COLOR_FormatYUV422PackedPlanar)。
Packed YUV420
每4个连续的Y分量公用一个UV空间,yuv 交错存储。
Planer YUV422
每2个连续的Y分量公用一个UV空间,先存全部的Y,然后是U(V),最后是V(U)。
YUV422P(COLOR_FormatYUV422Planar)。
Planer YUV420
每4个连续的Y分量公用一个UV空间。先存全部的Y,然后是U(V),最后是V(U)。、
YUV420P(COLOR_FormatYUV422Planar)。
Semi Planer YUV422
每2个连续的Y分量公用一个UV空间。先存全部的Y,然后是UV交错存储。
YUV422SP(COLOR_FormatYUV422SemiPlanar)。
Semi Planer YUV420
每4个连续的Y分量公用一个UV空间。先存全部的Y,然后是UV交错存储。
YUV422SP(COLOR_FormatYUV422SemiPlanar)。
衍生存储格式
I420 -- YUV 420 Planer
I420 是 YUV 420 Planar 的一种,YUV 分量分别存放,先Y,跟U,最后是V。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U
U U U
U U U
V V V
V V V
V V V
YV12 -- YUV 420 Plannar
YV12 是 YUV 420 Planar 的一种,YUV 分量分别存放,先是Y,后面跟V, 最后是U。
与 I420 不同的是,YV12 是先 V 后 U。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V V V
V V V
V V V
U U U
U U U
U U U
NV12 -- YUV 420 Semi-Planar
NV12 是 YUV 420 Semi-Planar 的一种:Y 分量单独存放,UV 分量交错存放。
UV 在排列的时候,先U后V。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V
U V U V U V
U V U V U V
NV21 -- YUV 420 Semi-Planar
NV21 是 YUV 420 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。
与 NV12 不同的是,UV 在排列的时候,先 V 后 U。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U
V U V U V U
V U V U V U
I422 -- YUV 422 Planar
I422 是 YUV 422 Planar 的一种,YUV 分量分别存放,先是Y,跟U, 最后是V。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U U U U
U U U U U U
U U U U U U
V V V V V V
V V V V V V
V V V V V V
YV16 -- YUV 422 Planar
YV16 是 YUV 422 Planar 的一种,YUV 分量分别存放,先是Y,后面跟V, 最后是U。
与 I422 不同的是,YV16 是先 V 后 U。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V V V V V V
V V V V V V
V V V V V V
U U U U U U
U U U U U U
U U U U U U
NV16 -- YUV 422 Semi-Planar
NV16 是 YUV 422 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。
UV 在排列的时候,先 U 后 V。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V
U V U V U V
U V U V U V
U V U V U V
U V U V U V
U V U V U V
NV61 -- YUV 422 Semi-Planar
NV61 是 YUV 422 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。
UV 在排列的时候,先 V 后 U。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U
V U V U V U
V U V U V U
V U V U V U
V U V U V U
V U V U V U
YUVY -- YUV 422 Packed Interleaved
YUVY 属于 YUV 422 Interleaved 的一种。
事实上 Interleaved 是属于 Packed 的,但是在 422 中,用 Interleaved 更加形象一些。
在 Packed 内部,YUV 的排列顺序是 Y U V Y,两个 Y 共用一组 UV。
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
Y U V Y Y U V Y Y U V Y
VYUY -- YUV 422 Packed Interleaved
VYUY 属于 YUV 422 Interleaved 的一种。
在 Packed 内部,YUV 的排列顺序是 VYUY,两个 Y 共用一组 UV。
V Y U Y V Y U Y V Y U Y
V Y U Y V Y U Y V Y U Y
V Y U Y V Y U Y V Y U Y
V Y U Y V Y U Y V Y U Y
V Y U Y V Y U Y V Y U Y
V Y U Y V Y U Y V Y U Y
UYVY -- YUV 422 Packed Interleaved
UYVY 属于 YUV 422 Interleaved 的一种。
在 Packed 内部,YUV 的排列顺序是 UYVY,两个 Y 共用一组 UV。
U Y V Y U Y V Y U Y V Y
U Y V Y U Y V Y U Y V Y
U Y V Y U Y V Y U Y V Y
U Y V Y U Y V Y U Y V Y
U Y V Y U Y V Y U Y V Y
U Y V Y U Y V Y U Y V Y
I444 -- YUV 444 Plannar
I444 属于 YUV 444 Plannar 的一种。
YUV 分量分别存放,先是Y,后面跟U。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
YV24 -- YUV 444 Plannar
YV24 属于 YUV 444 Plannar 的一种,YUV 分量分别存放,先是Y,后面跟V,最后是U。
与 I444 不同的是,YV24 是先排列 V。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
NV24 -- YUV 444 Semi-Planar
NV24 是 YUV 444 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。
UV 在排列的时候,从 U 开始。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V U V U V U V
U V U V U V U V U V U V
U V U V U V U V U V U V
U V U V U V U V U V U V
U V U V U V U V U V U V
U V U V U V U V U V U V
NV42 -- YUV 444 Semi-Planar
NV42 是 YUV 444 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。
UV 在排列的时候,从 V 开始。
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
YUV 444 Packed
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
Y U V Y U V Y U V Y U V Y U V Y U V
YUV422 转RGB565
自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。我们比较常接触到的就包括 RGB / CMYK / YIQ / YUV / HSI等等。
对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV这两种(实际上这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …)。
RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。即使只是RGB YUV这两大类色彩空间,所涉及到的知识也是十分丰富复杂的。
Camera Sensor中最常用的 YUV 模型是 YUV422 格式,因为它采用4个字节描述两个像素,能和RGB565模型比较好的兼容。有利于Camera Sensor和Camera controller的软硬件接口设计。
YUV模型用于PAL制式的电视系统,Y表示亮度,UV并非任何单词的缩写。
YIQ模型与YUV模型类似,用于NTSC制式的电视系统。YIQ颜色空间中的I和Q分量相当于将YUV空间中的UV分量做了一个33度的旋转。
YCbCr颜色空间是由YUV颜色空间派生的一种颜色空间,主要用于数字电视系统中。从RGB到YCbCr的转换中,输入、输出都是8位二进制格式。
RGB 转 YUV
- Y=0.30R + 0.59G + 0.11B
- U=0.493(B-Y)
- V=0.877(R-Y)
从公式中,我们关键要理解的一点是,UV / CbCr信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助。
YUV 转RGB 快速算法
这里指的YUV实际是YcrCb了,YUV2RGB的转换公式本身是很简单的,但是牵涉到浮点运算,所以,如果要实现快速算法,算法结构本身没什么好研究的了,主要是采用整型运算或者查表来加快计算速度。
首先可以推导得到转换公式为:
- R = Y + 1.4075 *(V-128)
- G = Y – 0.3455 *(U –128) – 0.7169 *(V –128)
- B = Y + 1.779 *(U – 128)
整型算法
要用整型运算代替浮点运算,当然是要用移位的办法了,我们可以很容易得到下列算法:
- u = YUVdata[UPOS] - 128;
- v = YUVdata[VPOS] - 128;
- rdif = v + ((v * 103) >> 8); // (1+103/256 = 1.4023)*v
- invgdif = ((u * 88) >> 8) +((v * 183) >> 8); // (u*0.3437 + v*0.7148)
- bdif = u +( (u*198) >> 8); // (1 + 198/256 = 1.7734) *u
- r = YUVdata[YPOS] + rdif;
- g = YUVdata[YPOS] - invgdif;
- b = YUVdata[YPOS] + bdif;
要从RGB24转换成RGB565数据还要做移位和或运算:
RGBdata[1] =( (r & 0xF8) | ( g >> 5) );
RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
查表法
略。
附件
YUV422 转 RGB565实现代码
参考文献和链接
https://www.jianshu.com/p/538ee63f4c1c
https://www.jianshu.com/p/3e44c2262775
https://www.cnblogs.com/huaping-audio/archive/2009/12/27/1633624.html
http://blog.sina.com.cn/s/blog_475e9bf20100siir.html