Android二维码扫描开发(二):YUV图像格式详解
前一篇提到了,相机返回的是YUV格式的图像数据,那么YUV到底是怎样一种格式呢?本篇将对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数据,那么下面几种采样如下图所示:
[存储方式]
YUV数据的存储方式分为打包的(packed)和平面的(planar)。
packed存储方式是,每一组YUV作为一个连续存储,每个组后面跟着另外一组,常见的有UYVY、YUYV等类型,以YUYV(属于YUV422)为例,储存方式如下图所示:
从上图中可以看出,两个相邻的Y共用一组UV,Y和UV是交错储存的。
planar储存方式是,先是连续的Y,然后是连续的UV,UV可以交错也可以不交错。以YUV420为例,YUV420分为YUV420P和YUV420SP,区别是YUV420P中U和V是分开连续存储的,YUV420SP中,UV是交错存储的。如下图所示:
[常见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的计算方法,用矩阵公式表示的话,如下图所示:
如果用算数公式表示的话如下所示:
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的使用方法进行介绍。
【腾讯技术团队出品】Android零基础入门到精通,Android Studio安装教程+全套安卓基础教程
Android是使用Java语言开发的,所以想要学习Android,你必须有一定的Java基础,否则根本进行不下去。当然你没有也没有关系,这里为你提供一份Android编程入门教程,相信你能很快上手学习。
资料获取方式:
![](https://i-blog.csdnimg.cn/blog_migrate/6fdb4e5d7ed8e6e34116063d53f5bfc1.png)
Android编程入门教程
Java语言基础从入门到熟悉
Kotlin语言基础从入门到熟悉
Android 技术栈从入门到熟悉
Android Jetpack 全家桶全面学习
学习Java期间使用的一般都是Eclipse。
但对于Android来说,建议使用 Android Studio 而不是Eclipse ADT。
对于新手来说可能安装Android Studio存在一定困难你可以看着以下视频,一步步的跟着学习安装运行