yuv转bmp说明
一 YUV起源
RGB是R(red)、G(green)、B(blue)的缩写,但同样是表示图像格式的YUV却不是缩写,而是一种颜色空间的表示方法,颜色空间的表示方法有很多种,常见的有RGB/CMYK/YIQ/YUV/HSI,而YUV是其中一种,可以把颜色空间表示方法看着为不同的坐标系表示方法,YUV中的Y是取自xyz坐标系中的y,而UV则是取自其他坐标系的名称,很多标准都是非常老的东西(半个世纪以上的历史 ),YUV不是凭空产生的,而是结合了多种颜色空间描述方法的特点而构建出来的,名称也是这么产生的,所以以YVU就是一种历史悠久的符号,现在应用也非常广泛。
二 YUV含义
YUV,分为三个分量,Y表示明亮度(Luminance或Luma),也就是灰度值;而U和V表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色,三 YUV格式
yuv格式包含两个概念:- 采样格式
- 封帧格式
1.采样目的
YUV的采样主要是为了减少数据量,如同模拟时代的隔行扫描,在效果降低不太明显的情况下,节省带宽。
U指定蓝色色度分量,V指红色色度分量,由于人的眼睛对视频的亮度更敏感,所以采样的时候减少蓝色和红色分量的采样精度,降低带宽的同时,肉眼也不会感觉到图像质量的明显的变化。2.采样格式
YUV采样格式包括YUV 4:4:4 YUV 4:2:2 YUV 4:1:1 YUV4:2:0这几种格式,YUV4:2:0应该是视频图像处理最常用的格式,这里就以YUV4:2:0为例简单介绍一下。4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量, 也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是 2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存(亮度4个字节,两个色度各1个字节)。
注意与YUV 4:1:1的区别,yuv420与yuv411的采样率是一样的,但采样方式有一些不同。
3.封帧格式分类
YUV 封帧格式又分为两种类型:打包(packed)格式和平面(planar)格式planar: Planar与 Semi-Planar 使用三个数组分开存放 YUV 三个分量,就像是一个三维平面一样。
这种打包格式比较常用,存储时,YUV分块存放,Planar与 Semi-Planar都存在U前V后与V前U后两种情况,用的较多的还是U前V后的格式。做YUV格式转换时,如果生成的图像轮廓都都正常的,但颜色不正常,一般都是分量对应关系没搞对。
packed : Interleaved(交错)将 YUV 分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel)。
4.常见封装格式
- YUV420 Planar
- YUV420 Semi-Planar
U前V后叫NV12,也称为YUV420SP,NV12是英特尔定义的视频格式, 它在英特尔硬件平台上是原生态支持。
https://msdn.microsoft.com/zh-cn/library/ms867704.aspx (使用 8 位 YUV 格式的视频呈现)
上面的图展示了YUV420图片在文件中的存放方式,1080P的YUV图片,Y在前面,UV跟在后面,总大小为高*宽的1.5倍。了解了打包格式与封装格式后,我们可以根据YUV图片大小来猜测图片的高宽,如我这里有一张YUV图片大小为3,110,400字节,除以1.5为2073600,这个分辨率大概200万左右,200万通常指的是1080P,实际上2073600/1920=1080,由于YUV图片没有控制信息,YUV转换为其他格式时,必须知道高宽、采样方式及打包格式,在做YUV转其他格式工具时,可以根据这一点来猜测YUV的高宽(单帧的YUV图片可以猜测高宽,但多帧的就没法猜),虽然分辨率非常乱,但常见的几种还是占主流。