04/09/2019

视频传输色彩空间概述

YUV444 422 420 RGBA8888 网上介绍的不要太多。但是感觉都不是太全,稍微总结一下。

概述

YUV and RGB

如字面意思所示,YUV就是存储图像Y(Luma)和UV(Chroma)的格式,RGBA就是存储图像的Red Green Blue Alpha 的格式。YUV的优点是图像亮度和色度分开存储,因此可以很方便地提取灰度图,在黑白电视还存在的年代同时兼容黑白和彩色电视的显示。

YUV一般存储为YCbCr的格式。即Y(亮度)Cb(蓝色色差)Cr(红色色差)。

Packed and Planer

Packed - 打包的 / Planer - 平面的 / Semi-Planer 半平面
如字面意思,Planer,RGB或YUV数据是打包在一起存放的,类似于RGBRGBRGBRGB…,而Planer则表示存储数据分为不同的平面(Plane),类似于RRRRRRGGGGGGBBBBBB。半平面则表示部分打包部分平面格式的数据,一般用在YUV里,也可以叫做Interleaved U/V Plane。

FourCC

FourCharacterCode 是用4个字节表示文件编码格式的方法,不仅可以表示视频编码算法(如”HEVC”->265编码, “H264”/“AVC1” -> 264编码等),也可以表示色彩空间。可以到 https://fourcc.org/ 查找色彩空间的列表和举例,也可以在v4l2中的videodev2.h(include/linux/videodev2.h)中找到

444 422 420

在YUV中使用,表示YUV三个分量的采样数量。因为人眼对亮度变化敏感而色度变化不敏感,所以一般对色度采样压缩图像体积。4:4:4表示每一个Y对应一个U和一个V, 4:2:2表示每两个Y对应一个UV, 4:2:0表示每4个Y对应一个UV。每个像素分别占24bit(3B) 16bit(2B) 12bit(1.5B)

8888 565

在RGB中使用。因为CPU需要内存对齐,使用RGB Packed Format时,一个像素占24bit,不好处理。因此带来两个方向的解决办法,一种是扩展到一个像素32bit,多出的8bit可以用来存储透明度信息(ARGB8888),或不存储信息(XRGB8888)。另一种是压缩到16bit - RGB565,因为人眼对绿光较敏感,因此多存储绿色信息,得到RGB565, R、B占用5bit, G占用6bit。当然,如果用Planer格式处理就没有这个问题。在图像存储(不需要高速处理)时,也可以使用Packed RGB888格式,就是所谓的24位图。

常用色彩空间

YUV420类

YUV 4:2:0 4个相邻像素点采样一个色度值,因此每个像素占用的空间可以从24bit->12bit。同时因为大多数图像输入设备(摄像头)只支持YUV420, 因此无论在海思还是RockChip中,YUV420都是最常用的格式之一。YUV420一个像素占用12bit字节,不太可能使用Packed格式存储。一般采用SemiPlaner或Planer方式存储。

YUV420SP (NV12/NV21)

YUV 4:2:0 SemiPlaner格式,较常用的格式。存储方法为Y为一个平面,UV合并为一个平面。
如图所示
具体使用时会有UV顺序问题,即存储时,是YYY….UVUVUV…还是YYY…VUVUVU…,因此会根据UV顺序的不同,分为NV12和NV21。NV12表示Cb在Cr前面,即YCbCr的顺序,而NV21表示YCrCb的顺序。
微软是这样定义NV12的:

A format in which all Y samples are found first in memory as an array of unsigned char with an even number of lines (possibly with a larger stride for memory alignment), followed immediately by an array of unsigned char containing interleaved Cb and Cr samples (such that if addressed as a little-endian WORD type, Cb would be in the LSBs and Cr would be in the MSBs) with the same total stride as the Y samples. This is the preferred 4:2:0 pixel format.

YUV420P (I420/YV12)

YUV 4:2:0 Planer格式。同样是420,只不过是平面格式,YUV分别在三个不同的平面中存储。
如图所示。
同样会存在UV顺序问题,I420(或者叫YU12)表示存储数据为YYY…UUU…VVV…, 而YV12表示顺序为YYY…VVV…UUU…

YUV422

一个像素占用16bit字节,可以在内存中完美的对齐。因此也可以Packed方式存储。

YUV422SP/YUV422P

与420类似,422也可以用平面或半平面存储。示意图如下:

具体UV顺序也可以变化。422SP可分为NV16和NV61, 422P一般采用YVU的格式,就叫做422P。

YUV422 Packed Format

有很多种存储方式,比如YUYV/UYVY等。在内存中为YUYVYUYVYUYV…这样存储。

YUV444

一个像素占24字节,一般采用Planer格式。