数字图像处理:YUV与RGB的一些理解

引言

正常做算法,我们一般接触到的数据来源都是RGB,如果用深度摄像机的话,数据格式都是RGBD,但是在视频采集卡中,视频采集芯片输出的码流一般都是YUV格式数据。而且,LZ最近因为项目原因,获取的数据格式已经不是熟悉的rgb类型了,所以还是需要进行对应的理解和整理的。

RGB

相信做图像处理的小伙伴们对RGB格式的图像数据都不陌生,R、G、B是什么意思呢?在实际获取的数字图像中,图像是以像素的形式呈现的,如果是彩色图像,那么每个像素会对应三个通道,分别为R(红色通道)、G(绿色通道)、B(蓝色通道),每个像素点呈现的颜色是三个通带的颜色合成展现出来的。

如果我们获取了一张图片,有2560*1440个像素点,如果采用上述RGB,每个通道是8bits,也就是1byte,所以正常是一个像素点有3bytes,2560x1440x3,大概在10.5M左右,可以想想,一张图片就怎么大,如果视频的帧率在60fps的话,那每秒钟的数据传输量在600多M,这个数据量是很大的。

那么YUV方式呢?

YUV

什么是YUV?

YUV其实是图像的另外一种编码方式。

其中“Y”表示明亮度(Luminance、 Luma),如果每个像素只用Y表示,就是我们常见的黑白电视了,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV的采样格式

1. YUV 4:4:4

YUV 444的方式很好理解,就是每个像素对应一个Y分量,一个U分量,一个V分量

四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
采样的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
映射出的像素点为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

这样每个像素也可以看成有三个分量,所以数据量和rgb的图像是一样的,同样按照这种传输方式,数据量和RGB的传输方式相同也为256014403 字节。

2. YUV 4:2:2

YUV4:2:2表示UV分量的采样率是Y分量的一般,这么说好像很难理解,但是按照下面的这个展示就很容易理解了

四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
采样的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 U3
映射出的像素点为:[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

这也会存在不同的排列方式,例如YUYV,YVYU,也有可能UYUV,VYUY,这样我们就可以看到平均一个对应一个Y分量,0.5个U分量,0.5个V分量。或者说每两个像素有两个Y分量,共用一个U分量,一个V分量,那么数据量就减少为:2560x1440x2字节,直接减少了1/3.

3. YUV 4:2:0

YUV 4:2:0 并不意味着不采样 V 分量。它指的是对每条扫描线来说,只有一种色度分量以 2:1 的采样率存储,相邻的扫描行存储不同的色度分量。也就是说,如果第一行是 4:2:0,下一行就是 4:0:2,在下一行就是 4:2:0,以此类推。换句话说是四个像素共用一个U,共用一个V。

图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
​
采样的码流为:
Y0 U0 Y1 Y2 U2 Y3 
Y5 V5 Y6 Y7 V7 Y8
​
映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

可以看到每四个像素对应四个Y分量,共用一个U分量和V分量,这样总的数据量为2560x1440x1.5,所以小伙伴在看代码时会很好奇,这1.5是哪里来的?1.5=1+0.25+0.25,平均每隔像素分摊到0.25个U和0.25个V,相比较RGB或者YUV444,能节约一半的存储空间

YUV的两种存储方式

  1. 紧缩格式(packed formats):
    将Y、U、V值存储成MacroPixels数组,和RGB的存放方式类似。
YUV YUV YUV
  1. 平面格式(planar formats):
    将Y、U、V的三个分量分别存放在不同的矩阵中。
YYYYYYYY.....UUUUUUUUUUU.......VVVVVVVVVVV

YUYV

YUYV 格式属于 YUV422,采用打包格式进行存储,Y 和 UV 分量按照 2:1 比例采样,每个像素都采集 Y 分量,每隔一个像素采集它的 UV 分量。

Y0 U0 Y1 V0 Y2 U2 Y3 V2

Y0 和 Y1 共用 U0 V0 分量,Y2 和 Y3 共用 U2 V2 分量。

UYVY

UYVY 也是 YUV422 采样的存储格式中的一种,只不过与 YUYV 排列顺序相反。

U0 Y0 V0 Y1 U2 Y2 V2 Y3

还有YVYU, VYUY这些都是类似的

YUV 422P

YUV422P 属于 YUV422 的一种,它是一种 planer 模式,即 Y、U、V 分别存储。

	YYYYYYYYYYYYY....UUUUUUUUUU...VVVVVVVV...

YUV420P 和 YUV420SP

YUV420P 是基于 planar 平面模式进行存储,先存储所有的 Y 分量,然后存储所有的 U 分量或者 V 分量。和 YUV420SP

	YYYYYYYYYYYYY....UUUUUUUUUU...VVVVVVVV...

同样,YUV420SP 也是基于 planar 平面模式存储,与 YUV420P 的区别在于它的 U、V 分量是按照 UV 或者 VU 交替顺序进行存储。

YYYYYYY...UVUVUVUV...............
YYYYYYY...VUVUVUVU...............

YU12 和 YU21

YU12 和 YV12 格式都属于 YUV 420P 类型,即先存储 Y 分量,再存储 U、V 分量,区别在于:YU12 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U 。

NV21 和 NV21

NV12 和 NV21 格式都属于 YUV420SP 类型。它也是先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。

NV12 : 它的存储顺序是先存 Y 分量,再 UV 进行交替存储。

NV21: 它的存储顺序是先存 Y 分量,在 VU 交替存储。

参考地址:
https://baike.baidu.com/item/YUV/3430784
https://zhuanlan.zhihu.com/p/75735751

发布了300 篇原创文章 · 获赞 203 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/Felaim/article/details/103522381
今日推荐