Chinaunix首页 | 论坛 | 博客
  • 博客访问: 312342
  • 博文数量: 101
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 774
  • 用 户 组: 普通用户
  • 注册时间: 2018-10-15 14:13
个人简介

搭建一个和linux开发者知识共享和学习的平台

文章分类

全部博文(101)

文章存档

2024年(15)

2023年(24)

2022年(27)

2019年(8)

2018年(27)

分类: 嵌入式

2024-06-24 10:58:25

一、什么是YUV、YCrCb?

YUV是应用在视频领域中常用的颜色空间(color space),所谓颜色空间就是用来描述一个像素的包含了什么必要的元素。所以YUV其实包含了多种像素格式,它是一系列应用在视频领域的像素格式的总称。相对应的RGB也是一个用在显示领域常用的颜色空间,其像素格式有RGB565、RGB888等等。颜色空间之间是可以相互转换的,只不过某些过程可能存在损失。

YUV颜色空间中对一个像素的描述存在三个分量:

  • Y表示亮度(luminance),也就是灰度值,表示了图像的明暗的分量,Y的范围从[0,255],0表示纯黑,255表示纯白。
  • U表示红色色度分量(red Chroma),带有颜色的部分。
  • V表示蓝色色度分量(blue Chroma),带有颜色部分。

从上面的描述可以知道,每个分量都是8 bit位,也就是一个字节。(大多数情况)

YUV和YCrCb是什么关系呢?对于嵌入式来讲,只需要知道U和Cr分量是相似的,V和Cb是相似的。差异点在于他们的取值范围不一样:UV[0-255],CrCb[-128-127].因此YUV和YCrCb是可以相互转换的。在模拟信号上使用YUV,在数字信号上使用YCrCb

    Y = Y
    U = Cr + 128     V = Cb + 128 

二、YUV的排列方式

YUV有三种排列方式,是描述YUV三个分量中的分量在内存中的布局。分别有packed、

semi-planar、planar。

packd(打包排列)

指YUV的三个分量在内存中紧紧挨在一起,因此,每个YUV像素的分量依次排列在连续的内存中。

如:

//连续内存 YUVYUVYUVYUV...YUV
YUVYUVYUVYUV...YUV
YUVYUVYUVYUV...YUV 

semi-planar(半平面排列)

它将Y分量单独放在一个内存区域,UV分量交错地放在另外一个内存区域。也就是总共两块内存。其中存放UV分量的内存有两种形式:UVUVUV…UV或者VUVUVU…VU

如:

//addr 0 YYYYYYYY...YYY
YYYYYYYY...YYY
YYYYYYYY...YYY
YYYYYYYY...YYY //addr 1 UVUVUVUVUVUVUVUV…UVUVUV
UVUVUVUVUVUVUVUV…UVUVUV
UVUVUVUVUVUVUVUV…UVUVUV
UVUVUVUVUVUVUVUV…UVUVUV 

planar(全平面排列)

这种排列方式意思是说所有分量都单独存放在一个内存区域,也就是{BANNED}最佳多会有三个内存区域,单独存放Y/U/V

如:

//addr 0 YYYYYYYY...YYY
YYYYYYYY...YYY
YYYYYYYY...YYY //addr 1 UUUUUUUU...UUU
UUUUUUUU...UUU
UUUUUUUU...UUU //addr 2 VVVVVVVV...VVV
VVVVVVVV...VVV
VVVVVVVV...VVV 

三、YUV的采样率

经常听到的YUV4:4:4、YUV4:2:2、YUV4:2:0这三种后面带的数字就是YUV的采样比(Subsampling)。

但是上面的数字并不是YUV的分量数量的比值!

为什么会有采样比呢?因为科学家发现,人眼对亮度信息比色度信息敏感,因此可以按场景减少一些色度信息UV,这样能减少数据量以及可以在某些数据处理上有优势。

采样比的格式为a:b:c,我们在讨论采样比的时候针对的是一块4x2的像块,宽4个像素,高2行。

  • a=4
  • b表示{BANNED}中国第一行色度U/V采样的像素个数,{BANNED}最佳大为4
  • c表示第二行和{BANNED}中国第一行色度U/V发生变化的像素个数,{BANNED}最佳大为4

YUV444:

图片

以上是一个4x2的采样范围,a=4宽为4个像素,b=4在{BANNED}中国第一行上色度U/V采样的像素个数,四个都采样那干脆就直接保存下来,因此在水平方向上没有压缩,c=4在第二行和{BANNED}中国第一行色度U/V变化的像素个数,四个都变化那干脆就直接保存下来。因此YUV444实际上无论在水平还是垂直方向都没有经过数据压缩的,完整地用3个分量表示一个像素,这一点和RGB很像。

这种采样率下,YUV图像占据的内存大小计算公式:

width x hight x 3 

YUV444每个分量都有相同的采样频率,因此实际上并没有色度采样,完整的保留了原始YUV图像。压缩率为0,节省数据量0%。

YUV422

图片

以上是一个4x2的采样范围,a=4宽为4个像素,b=2在{BANNED}中国第一行上色度U/V采样的像素个数,那就采Y0和Y2的色度U/V,Y1和Y3的色度U/V丢掉,c=2第二行和{BANNED}中国第一行色度U/V变化的像素个数,因此Y4和Y6的色度U/V要被采样,综合就是YUV422.这时候水平方向上出现了数据的压缩,丢掉了Y1 Y3 Y5和Y7的U/V分量。一张图像中数据量,YUV422:YUV444 = 16:24=2:3

这种采样率下,因此YUV图像占据的内存大小计算公式:

width x hight x 2 

看图可以知道YUV222的特点是左右相邻两个像素公用一组色度U/V,压缩率66.7%,降低数据量33%.

此时如果一张YUV分辨率为W x H

  • 单独Y分量的图分辨率为W x H
  • 单独U分量的图分辨率为W/2 x H
  • 单独V分量的图分辨率为W/2 x H

YUV420

图片

以上是一个4x2的采样范围,a=4宽为4个像素,b=2在{BANNED}中国第一行上色度U/V采样的像素个数,那就采Y0和Y2的色度U/V,Y1和Y3的色度U/V丢掉,c=0第二行和{BANNED}中国第一行色度U/V变化的像素个数,因此第二行所有的色度U/V都丢掉,表示我们共用色度U/V吧。一张图像中数据量,YUV420:YUV444 = 12:24=1:2

这种采样率下,因此YUV图像占据的内存大小计算公式:

width x hight x 1.5 

看图可以知道YUV420的特点是上下左右相邻四个像素公用一组色度U/V,压缩率50%,降低数据量50%

此时如果一张YUV分辨率为W x H

  • 单独Y分量的图分辨率为W x H
  • 单独U分量的图分辨率为W/2 x H/2
  • 单独V分量的图分辨率为W/2 x H/2

YUV440

图片

以上是一个4x2的采样范围,a=4宽为4个像素,b=4在{BANNED}中国第一行上色度U/V采样的像素个数,那就{BANNED}中国第一行的哥像素全采,c=0第二行和{BANNED}中国第一行色度U/V变化的像素个数,因此第二行所有的色度U/V都丢掉。一张图像中数据量,YUV440:YUV444 = 16:24=2:3

这种采样率下,因此YUV图像占据的内存大小计算公式:

width x hight x 2 

看图可以知道YUV440的特点是上下相邻两个像素公用一组色度U/V,压缩率66.7%,降低数据量33%

此时如果一张YUV分辨率为W x H

  • 单独Y分量的图分辨率为W x H
  • 单独U分量的图分辨率为W x H/2
  • 单独V分量的图分辨率为W x H/2

YUV411

图片

以上是一个4x2的采样范围,a=4宽为4个像素,b=1在{BANNED}中国第一行上色度U/V采样的像素个数,采{BANNED}中国第一个宣像素的色度U/V,c=1第二行和{BANNED}中国第一行色度U/V变化的像素个数,因此第二行Y5 Y6 Y7色度U/V丢掉。表示我们共用色度U/V吧。一张图像中数据量,YUV411:YUV444 = 12:24=1:2

这种采样率下,因此YUV图像占据的内存大小计算公式:

width x hight x 1.5 

看图可以知道YUV411的特点是左右相邻四个像素公用一组色度U/V,压缩率50%,降低数据量50%

此时如果一张YUV分辨率为W x H

  • 单独Y分量的图分辨率为W x H
  • 单独U分量的图分辨率为W/4 x H
  • 单独V分量的图分辨率为W/4 x H

YUV400

图片

以上是一个4x2的采样范围,a=4宽为4个像素,b=0在{BANNED}中国第一行上色度U/V采样的像素个数,色度U/V全丢弃,c=0第二行和{BANNED}中国第一行色度U/V变化的像素个数,因此第二行色度U/V全丢弃。这相当于什么,相当于讲所有色度U/V都丢弃了,仅仅剩下亮度Y,相当于一张灰度图。一张图像中数据量,YUV400:YUV444 = 8:24=1:3

这种采样率下,因此YUV图像占据的内存大小计算公式:

width x hight 

看图可以知道YUV400的特点是所有色度U/V丢弃,压缩率33.4%,降低数据量66%

此时如果一张YUV分辨率为W x H

  • 单独Y分量的图分辨率为W x H
  • 单独U分量的图分辨率为0
  • 单独V分量的图分辨率为0

YUV410

这个采样率比较特殊,他的采样区域是4x4

图片

不重复讲解了

此时如果一张YUV分辨率为W x H

  • 单独Y分量的图分辨率为W x H
  • 单独U分量的图分辨率为W/4 x H/4
  • 单独V分量的图分辨率为W/4 x H/4

四、具体YUV像素格式

上面介绍了YUV的排列方式和采样率。这两个变量结合起来就形成了多种多样的像素格式。

一般描述都这样:在什么采样率下的什么排列方式,叫做什么像素格式。

图片

YUV444下的像素格式

packed

  1. yuv444 packed

YUV444已经说了不会丢弃任何分量,所以每个像素的YUV分量都是完整的,而又是packed格式,因此在内存中的排列是:

YUV YUV YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV YUV YUV
YUV YUV YUV YUV YUV YUV YUV YUV 

一个像素24位,同时还存在一个像素内什么分量排在第几个字节的情况。这里没仔细研究

planar

  1. I444

YUV分量分开三个平面来存,三个平面对应三个数组。再一个文件中先存完Y,再存U,再存V。平面顺序是Y-U-V。在内核的定义是

此在内存中的排列是:

YYYYYYYYY
YYYYYYYYY
YYYYYYYYY

UUUUUUUUU
UUUUUUUUU
UUUUUUUUU

VVVVVVVVV
VVVVVVVVV
VVVVVVVVV 
  1. YV24

YUV分量分开三个平面来存,三个平面对应三个数组。再一个文件中先存完Y,再存U,再存V。平面顺序是Y-V-U。

此在内存中的排列是:

YYYYYYYYY
YYYYYYYYY
YYYYYYYYY

VVVVVVVVV
VVVVVVVVV
VVVVVVVVV

UUUUUUUUU
UUUUUUUUU
UUUUUUUUU 

YV24是指每个像素平均占据24位,可以根据YUV444的图来计算。

semi-planar

  1. NV24

总共两个平面,也就是两个数组。Y分量单独存放,UV分量交错存放,UV在排列的时候顺序为UVUV。

此在内存中的排列是:

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
 
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV
UVUVUVUVUVUVUVUVUVUVUVUV 

NV24是指每个像素平均占据24位,可以根据YUV444的图来计算。

  1. NV42

和NV24相反

此在内存中的排列是:

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
 
VUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVU
VUVUVUVUVUVUVUVUVUVUVUVU 

NV42是用来标记是NV24反转UV而来。

YUV422下的像素格式

packed

  1. YUYV

在YUV422采样率下,特点是左右相邻两个Y共用一组U/V,YUYV格式就是指内存中的存储顺序是YU-YV,此在内存中的排列是:

    YU YV YU YV YU YV YU YV
    YU YV YU YV YU YV YU YV
    YU YV YU YV YU YV YU YV
    YU YV YU YV YU YV YU YV 
  1. UYVY
    UY VY UY VY UY VY UY VY
    UY VY UY VY UY VY UY VY
    UY VY UY VY UY VY UY VY
    UY VY UY VY UY VY UY VY 
  1. VYUY
    VY UY VY UY VY UY VY UY
    VY UY VY UY VY UY VY UY
    VY UY VY UY VY UY VY UY
    VY UY VY UY VY UY VY UY 
  1. YVYU
YV YU YV YU YV YU YV YU
YV YU YV YU YV YU YV YU
YV YU YV YU YV YU YV YU
YV YU YV YU YV YU YV YU 

planar

  1. I422

三个平面,YUV三个分量分开存储。此在内存中的排列是:

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
 
UUUUUU
UUUUUU
UUUUUU
UUUUUU
 
VVVVVV
VVVVVV
VVVVVV
VVVVVV 
  1. IV16(YV16)
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
 
VVVVVV
VVVVVV
VVVVVV
VVVVVV
 
UUUUUU
UUUUUU
UUUUUU
UUUUUU 

YV16意思是每个像素平均占16位,可以根据YUV422的图来计算。

semi-planar

  1. NV16

两个平面,Y单独一个平面,UV交错存储存放在另一个平面。此在内存中的排列是:

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
 
UVUVUVUVUVUV
UVUVUVUVUVUV
UVUVUVUVUVUV
UVUVUVUVUVUV 

NV16意思是每个像素平均占16位,可以根据YUV422的图来计算。

NV61

YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
YYYYYYYYYYYY
 
VUVUVUVUVUVU
VUVUVUVUVUVU
VUVUVUVUVUVU
VUVUVUVUVUVU 

NV61用来标记是NV16反转UV而来。

YUV420下的像素格式

packed

YUV420的特点是上下左右相邻4个像素点共用一组UV,因此YUV420不存在packed形式,因为UV不够分。

planar

  1. I420
    YYYYYYYYYYY
    YYYYYYYYYYY
    YYYYYYYYYYY
    YYYYYYYYYYY
     
    UUUUUU
    UUUUUU
     
    VVVVVV
    VVVVVV 
  1. YV12
    YYYYYYYYYYY
    YYYYYYYYYYY
    YYYYYYYYYYY
    YYYYYYYYYYY
     
    VVVVVV
    VVVVVV
     
    UUUUUU
    UUUUUU 

YV12是指每个像素平均占据12位,可以根据YUV420来计算。

  1. ICM1

和YV12类似,但是其U和V平面和Y的stride保持一致。这只影响在读取时候应该怎么读,存储是一样的。

图片
  1. ICM2
图片
  1. ICM3

与ICM1相似,调转UV 平面

图片
  1. ICM4

与ICM2相似,调转UV 平面

图片

semi-planar

  1. NV12

两个平面,UV交错

YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY

UVUVUVUV
UVUVUVUV 
  1. NV21
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY

VUVUVUVU
VUVUVUVU
阅读(365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~