yuv420 原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yuv420 原理相关的知识,希望对你有一定的参考价值。

参考技术A ```

bpp 位图的单位

16 bit per pixel

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

```

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

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方式传送占用极少的频宽 。

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

(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值的方法与上面一样。

(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中找到下面内容

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

在 BT.601  定义下面的常量

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

yuv各个分量取值范围

根据上面公式 yuv 转换RGB

整理成矩阵样式

HDTV with BT.709中规定

yuv 中的常量

其他的不变

矩阵结果是

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

YUV  RGB  和YCbCr 

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

在这里声明下

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

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

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

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

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

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

针对HDTV

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

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

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

借鉴文章

wiki

yuv与rgb 转换

以上是关于yuv420 原理的主要内容,如果未能解决你的问题,请参考以下文章

YUV模型:YUV420P和YUV420SP

YUV420sp与YUV420p互转

如何将yuv420p数据旋转90

C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)

C++ YUV420文件读取与显示,绘制矩形框,绘制线段(绘制直线),绘制多边形(常用YUV数据格式——YUV420P中的YU12与YUV420SP中的NV21)

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。