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

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编程入门教程,相信你能很快上手学习。

资料获取方式:

Android编程入门教程

Java语言基础从入门到熟悉

img

Kotlin语言基础从入门到熟悉

img

Android 技术栈从入门到熟悉

img

Android Jetpack 全家桶全面学习

img

学习Java期间使用的一般都是Eclipse。

但对于Android来说,建议使用 Android Studio 而不是Eclipse ADT。

对于新手来说可能安装Android Studio存在一定困难你可以看着以下视频,一步步的跟着学习安装运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值