android jpeg 转 yuv_从YUV到RGB

本文介绍了Android中从YUV格式转换为RGB的过程,详细讲解了YUV数据的存储格式、采样格式,以及YUV420p和YUV420sp(NV21)到RGB的转换方法,特别提到了在iOS上视频解码时如何处理YUV数据。
摘要由CSDN通过智能技术生成

背景

从视觉信息的来源方面来看:

  1. Android和iOS项目中,从摄像头来的数据都是YUV格式的;
  2. 解码一个视频时,每一帧中buffer里的data也都是YUV格式的(当你播放一个h264编码的MP4文件时,通过播放器的相关属性显示可以看到视频正以YUV420 planar被解码,什么意思?往后看! )。

从我们想要使用这些数据的角度来看:

  1. UI界面显示画面需要使用RGB格式的data;
  2. OpenCV等库需要RGB格式的输入;
  3. 神经网络需要RGB这3个channel的输入;

这就带来了一些问题,什么是以及为什么是YUV和RGB?如何从YUV转换到RGB?尤其是当了解到YUV本身就有很多种不同的格式。

什么是RGB数据

RGB 表示红(Red)、绿(Green)、蓝(Blue),也就是光的三原色,将它们以不同的比例叠加,可以产生不同的颜色。屏幕就是由红、绿、蓝三种发光的颜色小点组成的。(注意,颜料和不发光物体的三原色是黄、品红、青)。

比如一张1080p的图片,代表着有 1920 * 1080 个像素点。如果采用 RGB 编码方式,每个像素点都有红、绿、蓝三个原色,其中每个原色占用 1 个字节,每个像素占用3个字节,则一张1080p的图片就占用 1920 * 1280 * 3 / 1024 / 1024 = 7.03125MB 存储空间。比如著名的BMP位图就是这样保存图片的(所谓的RGB888格式,或者24位位图格式)。

图片的信息量有7.03125MB并不代表对应的图片文件的大小就是7.03125MB,因为两点:

  1. 图片的信息会被压缩,减小文件的大小;
  2. 图片文件会注入meta data,又会稍微增大文件大小;

总体上图片文件肯定是变小了。而压缩又主要分为两种:

  1. 无损压缩,比如BMP位图文件——顶多是使用行程长度编码(RLE,run-length encoding)来进行轻度的无损数据压缩(COCO数据集的分割data也使用了RLE),所以7.03125MB大小的内容会保存为6MB左右的文件;
  2. 有损压缩,最流行的就是jpg了,各种复杂的压缩算法,会根据图片内容的不同,使得图片文件的大小降低到几十KB到几百KB左右。

试想一下,如果没有有损压缩算法,像小米10手机这样的1亿像素摄像头,拍一张照片就是100000000 * 3 /1024 /1024 = 286.1MB的存储(还没包含metadata)。

RGB图片中的CHW和BGR概念

以著名的图像算法库OpenCV为例,我们常常听到一个概念:一个API输出或者输出的图片格式是CHW还是HWC,是RGB还是BGR......但是这代表什么意思呢?

Gemfield使用一个例子来解释下,在Python中,使用OpenCV来读取一个图片gemfield.jpg(640x640):

>>> img = cv2.imread("gemfield.jpg")
>>> img.shape
(640, 640, 3)

(640, 640, 3)这样的结果一看就是hwc格式(HWC三个字母分别代表Height、Width、Channel),相当于在内存中,img是个三维数组,从外层向内层依次是height、width、channel;也就是说:img是由640个height组成的,每个height是由640个width组成的,每个width是由3个channel组成的。而在每个widt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值