天天看点

Android二维码扫描开发(二):YUV图像格式详解

上一篇中,我们了解了Android二维码扫描开发的实现思路和原理。其中从相机里获取到的数据是NV21格式的,NV21属于YUV图像,当然有些外置摄像头会返回其他YUV格式的数据,那么我们就来看一看,到底什么是YUV图像。

RGB图像大家都了解,RGB图像分为了三个颜色分量,R红色分量,G绿色分量,B蓝色分量。而YUV图像,也是分为了三个分量,Y亮度分量,用来表示明亮度,也叫灰阶值,U分量和V分量是色值分量,用来表示图像色彩与饱和度,其中U分量也叫Cb,表示的图像蓝色偏移量,V分量也叫Cr,用来表示图像红色部分偏移量,所以YUV有时也写作YCbCr。

YUV图像把亮度和色度分开了,避免了亮度和色度的相互干扰,可以在降低色度采样率的情况下,保持图像的视觉质量。

[采样比率]

下面我们来看看YUV图像的采样方式,是如何改变色度采样率的。YUV图像有以下几种采样比例:

444采样中,Y:U:V=4:4:4,每一个Y对应一个UV,水平和垂直方向都保持原数据;

422采样中,Y:U:V=4:2:2,每两个Y共用一个UV,水平方向采用2:1采样,垂直方向保持原数据;

411采样中,Y:U:V=4:1:1,每四个Y共用一个UV,水平方向采用4:1采样,垂直方向保持原数据;

420采样中,Y:UV=4:2或Y:U:V=4:1:1,每四个Y共用一个UV,水平方向和垂直方向都采用2:1采样。

如果用×表示Y数据,用〇表示UV数据,那么下面几种采样如下图所示:

Android二维码扫描开发(二):YUV图像格式详解

[存储方式]

YUV数据的存储方式分为打包的(packed)和平面的(planar)。

packed存储方式是,每一组YUV作为一个连续存储,每个组后面跟着另外一组,常见的有UYVY、YUYV等类型,以YUYV(属于YUV422)为例,储存方式如下图所示:

Android二维码扫描开发(二):YUV图像格式详解

从上图中可以看出,两个相邻的Y共用一组UV,Y和UV是交错储存的。

planar储存方式是,先是连续的Y,然后是连续的UV,UV可以交错也可以不交错。以YUV420为例,YUV420分为YUV420P和YUV420SP,区别是YUV420P中U和V是分开连续存储的,YUV420SP中,UV是交错存储的。如下图所示:

Android二维码扫描开发(二):YUV图像格式详解

[常见YUV格式]

YUYV,YUYV属于YUV422,根据上面的图像也可以看出来,Y和UV是按照(YUYV)(YUYV)(YUYV)...的格式交错存储的。

UYVY,UYVY也是YUV422图像,和YUYV类似,不过是Y和UV的存储顺序按照(UYVY)(UYVY)(UYVY)...的顺序存储的。

YUV422P,属于YUV422图像,其中Y、U、V分别连续存储。

NV21和NV12,这两种格式都属于YUV420SP图像,Y连续存储,然后是交错的UV,二者区别是,NV21是V在U前,NV12是U在V前。

YU12和YV12,这两种格式属于YUV420P图像,Y、U、V分别连续存储。区别是YU12是Y在前,其次是U,最后是V;而YV12是Y在前,其次是V,最后是U。

I420,即YU12图像。

 [YUV图像处理]

①YUV422和YUV420之间的转换

YUV422转YUV420,需要在垂直方向上隔行采样,只保留奇数行或偶数行的UV数据。YUV420转YUV422,需要在垂直方向上,将一行拷贝成两行。

②YUV转RGB

YUV和RGB的计算方法,用矩阵公式表示的话,如下图所示:

Android二维码扫描开发(二):YUV图像格式详解

如果用算数公式表示的话如下所示:

RGB转YUV:

Y = 0.299 R + 0.587 G + 0.114 B

U = - 0.1687 R - 0.3313 G + 0.5 B + 128

V = 0.5 R - 0.4187 G - 0.0813 B + 128

YUV转RGB:

R = Y + 1.402 (V - 128)

G = Y - 0.34414 (U - 128) - 0.71414 (V - 128)

B = Y + 1.772 (U - 128)

注意,这里只是单个像素点的转换方法,图像里的批量转换,还需根据YUV的储存格式进行考虑。

YUV图像就先讲解到这里,下一篇我将对YUV图像和RGB图像的亮度计算,以及zxing的使用方法进行介绍。