yuv420 原理

```

bpp 位图的单位

16 bit per pixel

每个像素点分解为16个字节来表示

```


今天做opengl的照相机,需要将YUV40f 格式转换成RGBA 的样式。因此这里有必要好好研究下YUV420 数据的内存排列。

1. YUV简介

YUV定义:分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV格式:有两大类:planar和packed。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。

YUV存储:格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

YUV特点:也是一种颜色编码方法,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传 输,所以用YUV方式传送占用极少的频宽


 图:用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

2.  存储方式

    下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。

<1>packed格式

(1) YUVY 格式 (属于YUV422)


YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。

(2) UYVY 格式 (属于YUV422)

UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。


<2>planar格式

(1) YUV422P(属于YUV422)


YUV422P 也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量, 最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如, 对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。


(2)YV12,YU12格式(属于YUV420)


YU12和YV12属于YUV420格 式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一 组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。

(3)NV12、NV21(属于YUV420)


NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00

从上面的知识我们知道,yuv的格式需要知道是planer 还是packet 。再知道是420  422 还444 排布。


yuv 转换RGB

我们从wiki中找到下面内容

Y′UV signals are typically created from RGB (red, green and blue) source. Weighted values of R, G, and B are summed to produce Y′, a measure of overall brightness or luminance. U and V are computed as scaled differences between Y′ and the B and R values.

yuv 是用rgb 创建出来的。  Y 与rgb有关系, 而uv 只与 BR 有关,与G无关。

在BT.601 定义下面的常量


yuv 是计算机根据rgb计算出来的。


yuv各个分量取值范围

Y=[0,1]

U= [−Umax, Umax]

V=  [−Vmax, Vmax].

根据上面公式 yuv 转换RGB


整理成矩阵样式


HDTV with BT.709中规定

yuv 中的常量


其他的不变

矩阵结果是


在这里我们应该再理解一些知识。

YUV  RGB  和YCbCr 

我以前看资料总是把yuv和YCbCr 认为是一样的,这是没有基础的我导致的盲区。看了这篇文章 。醒悟。原来yuv 和YCbCr不是一回事情

在这里声明下

YUV - RGB Color Format Conversion

YCbCr - RGB Color Format Conversion

YPbPr - RGB Color Format Conversion

都是RGB颜色空间,只不过这些经过了一些变化而已。

YUV 用在 模拟 PAL or 模拟 NTSC视频格式,不用在数字视频格式 。


rgb 转换yuv


yuv转换RGBRG

ycbcr 是用于数字视频。而SDTV bt.601


RGB转换成YCbCr   SDTV


YCbCr转换成RGB   SDTV

而对于RGB 对于全范围的YCbCr。 this full-range color format is used for JPEG images. 用于jpeg image  full-range

RGB转换成full-range YCbCr 颜色


full-range YCbCr 转换成RGB

而对于更高级别的HDTV -bt-709


RGB转换成YCbCr  HDTV


YCbCr 转换成RGB HDTV

对于YPbPr 。针对YCbCr 而言,PbPr的取值范围不同


RGB 转换 YPbPr SDTV


YPbPr转换成RGB SDTV

针对HDTV

RGB 转换YPbPt  HDTV


YPbPt 转换 RGB HDTV

所以在ios 上我们经常看见这个宏定义

kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange = '420v', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, video-range (luma=[16,235] chroma=[16,240]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */

这个宏定义是规定视频输出的像素是YCbCr 格式的。取值范围是Y 是这里的luma CbCr是chroma。从上面我们知道,这个格式是数字电视格式。

kCVPixelFormatType_420YpCbCr8BiPlanarFullRange = '420f', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */

下面这个格式同理用于图片。经常用于图片







借鉴文章

wiki

yuv与rgb 转换

你可能感兴趣的:(yuv420 原理)