前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android二维码扫描开发(二):YUV图像格式详解

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

作者头像
非著名程序员
发布2018-02-02 12:13:42
1.9K0
发布2018-02-02 12:13:42
举报
文章被收录于专栏:非著名程序员非著名程序员

前一篇提到了,相机返回的是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的使用方法进行介绍。

源码地址:https://github.com/xushanmeng/QRCodeScannerDemo

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非著名程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档