YUV和RAW图格式
颜色是人的视觉系统对光谱中可见区域的感知效果,它仅存在于人的眼睛和大脑中。为了准确地描述颜色, 必须引入色彩空间的概念。正如几何上用坐标空间来描述坐标集合, 色彩空间用数学方式来描述颜色集合。常见的3个基本色彩模型是RGB、CMYK和YUV 。
除了以上3种色彩空间外,还有其他一些模型,如HSI和HSV等,用于直接表达色彩、饱和度和亮度的概念,以简化程序的设计。
本篇笔记介绍YUV和Bayer Raw RGB格式,总的组织如下。
第一章介绍YUV,首先介绍YUV部分采样的概念和各种YUV格式布局。接着介绍处理YUV时会遇到的问题,说明YUV内容的修改以及stride、slice的概念。
第二章介绍Bayer Raw,说明Bayer Raw的四种模板和去马赛克操作,并介绍Raw的压缩格式——MIPI Raw。
第三章介绍在了解了上述图片格式之后开发的看图工具,并说明如何查看高通的私有格式。
1. YUV
YUV是一种基本的色彩空间,Y是明视度(Luminance),即亮度(实际上代表灰度值),而U和V则是指色调,即描述图像色彩饱和度的属性。黑白系统只使用Y信息,因为U和V是附加上去的,所以黑白系统仍能正常显示。
下图是Y=0.5时,Cb和Cr对应的颜色。
1.1 部分采样
广播、视频和成像标准使用YUV色彩空间还有一个重要的原因,就是与人的视觉系统很有关系。人类的眼睛对低频信号比高频信号具有更高的敏感度。事实上, 人类的眼睛对明视度的改变也比对色彩的改变要敏感的多。因此对人类而言, Y分量比UV分量重要, 根据人眼的这一特征, 在不使用任何复杂算法的前提下, 可以适当地抛弃U和V分量以达到压缩的目的, 这就是部分取样(subsampling) 。
部分取样的常见方式有YUV444(无压缩)、YUV422(33.3%压缩)、YUV411(50.0%压缩)、YUV420(50.0%压缩)等,其中的数字表明了Y、U、V3个分量的取样比例, 即各分量水平取样因子与垂直取样因子乘积的比例。
设Y分量的水平取样因子为N,垂直取样因子为N。U和V分量的水平取样因子均为M1,垂直取样因子均为M2。则Y、U、V各分量的取样比为(NxN):(M1xM2):(M1xM2)。
若取N=2,M1=2,M2=2,这就是YUV444的一种取样方式。
若取N=2,M1=2,M2=1,这就是YUV422的一种取样方式。
若取N=4,M1=4,M2=1,这就是YUV411的一种取样方式。
若取N=2,M1=1,M2=1,这就是YUV420的一种取样方式。
Tip: 相较于官方的定义,YUV420也有一种直观的理解,与YUV411相比,对于UV分量,在垂直方向上提高了1倍采样频率,在水平上以U/V间隔的方式减少了一半采样频率。
1.2 YUV格式与FOURCC
图像是由像素组成的一种排列,按照排列的不同,YUV家族可分为许多不同的格式。按照图像中 Y、U、V 3个成员的聚集方式,YUV格式可以分为两大类,字节序列格式和平面格式。
字节序列格式中,Y、U和V的取值组合在一起形成宏像素,宏像素是像素组合的最小数据单元,由宏像素构成一个单一的数组。常见的字节序列格式有YVYU、UYVY等。
平面格式中,不同的分量独立存储在某一数组中。平面格式再往下可分类为交错格式(NV12等)和非交错格式(YV12等)。
由于YUV格式的复杂性,微软引入了FOURCC(Four Character Code)序列,来表示数据流格式,每种格式用4个字符的FOURCC序列来唯一标识。平时碰到不了解的格式,可以先看看FOURCC上的定义:http://www.fourcc.org/。
1.2.1 YUV内容修改当要在YUV图片上添加水印或者画调试的人脸框的时候,就需要对YUV图片的内容进行修改。以下面的YUV420格式图片为例,在进行修改的时候同一颜色的分量内容要一一对应、一并修改。由这张图也可以看出,YUV420格式的图片宽高都要是偶数。
1.2.2 stride和slice可能由于硬件特性或效率考虑,获取的图片会多一些无用的信息,无用的信息用stride和slice指示。宽(width)和高(height)的单位是像素,stride的单位是字节(stride x slice 就等于平面的实际存储大小)。
如果某种YUV格式的图片,Y、U、V分量占一个字节(比如NV12格式),宽高为1440x1080。如果没有字节对齐等因素,stride就为1440x1=1440;如果需要按照64字节对齐,stride就为1472。
如果某种YUV格式的图片,Y、U、V分量占两个字节(比如P010格式),宽高为1440x1080。如果没有字节对齐等因素,stride就为1440x2=2880。
2. BAYER RAW
在彩色数字相机的成像传感器结构中,为准确获取目标景物信息,通常采用3片CCD同时采集红、绿、蓝三种颜色信号,通过模数转换器和图像处理单元生成彩色图像,彩色图像每个像素包括红、绿、蓝三个颜色分量,图像分辨率高、细致明锐。
由于采用3片CCD结构,相机体积大、设计和生产成本高,因此3-CCD彩色相机一般只限于在专业研究和应用领域使用,大多数彩色数字相机都采用一片CCD作为图像传感器。单CCD相机通过使用彩色滤波阵列(Color Filter Array,CFA)覆盖在CCD表面获取颜色信息,每个CCD单元只有一种颜色分量通过,为获得全彩色图像,需要通过色彩还原方法恢复另外两种颜色分量。目前在彩色数字相机中普遍采用基于Bayer模板的彩色滤波阵列。
在Bayer颜色滤波阵列中,RGB三色的感光单元不是平均分布。基于人眼对绿色比较敏感,绿色(G)占50%,红色(R)和蓝色(B)各占25%。
根据彩色滤波阵列的排列不同,Bayer彩色图像可分为BGGR、GBRG、GRBG和RGGB四种格式。
2.1 原始RAW图显示补充缺失的颜色分量并设置为0,再按照常规RGB图像进行解析。由于每个像素只有一个分量,并且G分量占50%,所以原始的RAW图看起来偏暗、偏绿,并且像素之间过渡不平滑。
2.2 去马赛克与3-CCD相机获取的全彩色图像相比,Bayer彩色图像每个像素只有红、绿、蓝其中的一个分量,信息量只有全彩色图像的1/3,图像分辨率和图像质量低于全彩色图像。为提高图像分辨率和图像质量,需要通过色彩还原方法恢复另外两种颜色分量,重建全彩色图像。
一般采用插值的方法进行色彩还原,经典的算法有:2x2邻域复制插值法、3x3邻域双线性插值法和5x5邻域高质量插值法。
2.3 MIPI RAWMIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准,目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性。其中CSI(Camera Serial Interface)规定摄像头接口。
3. YUV和BAYER RAW查看工具
看图工具基于FFMpeg开发,如下图所示,使用ffmpeg -pix_fmts命令可以看到,FFMpeg支持的格式非常丰富,多达200多种。
为了之后方便扩展和维护,并且图片格式本身就有分类,所以采用以下继承方式。看图工具的核心部分就是去掉原图的stride,将各个分量平面传给FFMpeg接口,最后得到返回的转化好的RGB24图片用于显示。
Tip:编译看图工具的Qt Linux版本FFMpeg在Linux下不像在Windows下有现成的动态链接库提供下载,需要自己下载源码编译得到动态链接库。使用以下命令进行配置,其中--enable-shared指定编译动态链接库,--arch=x86_64指定编译64位版本,--prefix指定输出路径。
- configure --enable-shared --arch=x86_64 --prefix=/home/tim/ffmpeg/out
配置好后,调用以下命令就可以在指定的输出目录下得到所需要的动态链接库。
- make
- make install
得到动态链接库后就可以照常使用Qt进行编译,得到可执行文件,在使用linuxdeployqt打包之前,还需要做一些工作:使用ldd命令验证是否能找到所有相关的动态链接库,将不能找到的动态链接库路径添加到LD_LIBRARY_PATH。同时将Qt的编译器路径也添加进PATH变量。
- export LD_LIBRARY_PATH=pack_lib:$LD_LIBRARY_PATH
- export PATH=/opt/Qt5.14.2/5.14.2/gcc_64/bin:$PATH
最后使用linuxdeployqt打包。
- linuxdeployqt-6-x86_64.AppImage WatchPic -appimage
3.1 高通私有图片格式的查看
高通为了减小带宽,会对图片进行压缩。但是由于压缩的算法未知,所以需要使用高通提供的网站将这类图片(比如UBWC开头的格式)先转化成公开标准的图片格式,再进行查看。
操作的具体步骤为:登陆账号后选择IMAGE CONVERTER;之后在弹出的框中输入各种选项。需要注意的是宽高参数,除了宽高参数,其余参数都能准确填写,填写的宽高信息可能和原始的宽高不对应。