鹰眼视图——《图样,too simple》系列之二

网友投稿 803 2022-05-29

引言:最近为FPGA验证做图片生成器,检索了多种图片格式的介绍文档,这里做一个总结,希望对刚接触数字图像处理的新同事有所帮助。本系列分三部分,介绍工作中常见的YUV、RAW等各种图片格式,不求艰深晦涩,但求简洁明了。

本文是第二部分:YUV?什么鬼?à so easy!

1      YUV简介

与RGB类似,YUV也是3个分量的组合,其中Y表示明亮度,也就是灰度值;U和V表示色彩(色度)。YUV等同于YCbCr,其中Cb是Component blue的缩写,即蓝色分量,表示输入信号蓝色部分与亮度值之间的差异,Cr是Component red的缩写,即红色分量,表示输入信号红色部分与亮度值之间的差异。

可见YUV实现了亮度信号Y与色度信号U/V的分离,可以独立存储和传输,另外可以根据人眼特性进行压缩采样(下采样),从而显著降低图像存储容量及传输带宽。

鹰眼视图——《图样,too simple》系列之二

研究表明,人眼对亮度的敏感超过色度,色度信息减少一点,人眼几乎难以察觉。基于此,人们保留了每个像素点的亮度Y信息,对UV信息进行隔行或隔列采样(多像素共享一个U分量和V分量);按照不同的采样率,衍生出YUV4:4:4、YUV4:2:2和YUV4:2:0三种常见格式。

2      YUV444

YUV444格式是YUV4:4:4的简写,表示Y:U:V=4:4:4,即没有压缩采样,每一个像素的YUV三分量都得到保留。

3      YUV422

YUV422格式是YUV4:2:2的简写,表示Y:U:V=4:2:2,从字面上看,即相邻的4个像素点除了保留4个Y分量,另外只保留2个U分量和2个V分量。实际表现在整幅图像上,就是每行像素中,隔列丢弃一组UV信息,下图中黑点表示像素点的Y分量,空心圆表示采用该像素点的UV分量:

按照YUV分量存储顺序不同,又分为YUYV、UYVY和YUV422P三种格式:

3.1      YUYV

为了一目了然,以2行x4列像素点为例,以下为采样压缩前的数据,下标为像素点序号:

上图中两个相邻的像素组成一个宏像素(Macro-Pixel),如红框所示为第一个宏像素。第一个宏像素经4:2:2采样压缩后,只保留Y0、Y1、U0和V0,如果存储顺序为Y0U0Y1V0,这种存储格式就是YUYV(有的文档也称YUY2)。依此类推,上述8个像素采样后的数据排列如下:

相应的存储顺序为:Y0U0Y1V0  Y2U2Y3V2  Y4U4Y5V4  Y6U6Y7V6

进而可以扩展到1024*768分辨率及更大尺寸的YUYV图片。

3.2      UYVY

与YUYV类似,只是每个宏像素内部YUV分量存储的顺序不同,按照UYVY的顺序存储,就叫UYVY格式(顾名思义)。

同样以上述2行x4列像素点为例,则采样后的数据排列如下

相应的存储顺序为:U0Y0V0Y1  U2Y2V2Y3  U4Y4V4Y5  U6Y6V6Y7

进而可以扩展到1024*768分辨率及更大尺寸的UYVY图片。

3.3      YUV422P

上述两种格式都是packed存储方式,即每个宏像素点的YUV分量都是打包起来逐个包进行存储。YUV422P格式与此不同,这里的P是planar的缩写,即平面存储方式,分Y/U/V三个平面分别存储:先连续存储所有像素点的Y,紧接着存储所有像素点的U,最后是所有像素点的V。

同样以上述2行x4列像素点为例,采样后的数据存储顺序为:

Y0Y1Y2Y3Y4Y5Y6Y7  U0U2U4U6  V0V2V4V6

进而可以扩展到1024*768分辨率及更大尺寸的YUV422P图片。

4      YUV420

YUV420格式是YUV4:2:0的简写,但并不表示整幅图像中Y:U:V的采样率为4:2:0,即并不表示丢弃了所有V分量。而是表示在某一行中丢弃所有V分量,此行内Y:U:V=4:2:0,但在紧邻的下一行中保留一半V分量,丢弃所有U分量,此行内Y:U:V=4:0:2。从整幅图上看,所有Y分量被保留,每个2x2小窗口构成一个宏像素(Macro-Pixel),共享一个UV分量,如下图所示,黑色实心圆代表Y,空心圆代表UV:

按照YUV分量存储顺序不同,又分为I420、YV12、NV12、NV21四种格式:

4.1      I420

I420属于420P中的一种,即平面存储方式:Y、U、V三分量分开独立存储。先存储所有Y,然后U,最后是V。同样以上述2行x4列像素点矩阵为例:

采样后I420格式图片数据的存储顺序为:

Y0Y1Y2Y3Y4Y5Y6Y7  U0U2  V4V6

进而可以扩展到1024*768分辨率及更大尺寸的I420图片。

4.2      YV12

YV12也属于420P中的一种,即平面存储方式:Y、U、V三分量分开独立存储。但UV分量存储顺序调换,先存储所有Y,然后V,最后是U。同样以上述2行x4列像素点矩阵为例:

采样后YV21格式图片数据的存储顺序为:

Y0Y1Y2Y3Y4Y5Y6Y7  V4V6    U0U2

进而可以扩展到1024*768分辨率及更大尺寸的YV12图片。

4.3      NV12

NV12属于YUV420sp中的一种,这里的sp是semi-planar的缩写,即半平面存储方式:不再是3个平面,而是两个平面——Y平面和UV平面,分别独立存储Y分量和UV分量。先存储所有Y,然后UV平面中UV交错存储。同样以上述2行x4列像素点矩阵为例:

采样后NV12格式图片数据的存储顺序为:

Y0Y1Y2Y3Y4Y5Y6Y7  U0V4U2V6

进而可以扩展到1024*768分辨率及更大尺寸的NV12图片。

4.4      NV21

NV21也属于YUV420sp中的一种,先存储所有Y,然后UV平面中UV交错存储,与NV12不同的是UV平面中UV分量先后顺序是颠倒的。同样以上述2行x4列像素点矩阵为例:

采样后NV21格式图片数据的存储顺序为:

Y0Y1Y2Y3Y4Y5Y6Y7  V4U0V6U2

进而可以扩展到1024*768分辨率及更大尺寸的NV21图片。

5      Y8

最后提一下最简单的Y8格式,顾名思义,就是每个像素点只保存Y分量,每个Y分量用8个bit位表示,取值为0-255。这与我们上篇提到的单通道256阶灰度图非常类似,是YUV色彩空间中的灰度图。

另外澄清一下,检索国外文献的时候要注意,他们称这种格式为Luma 8bits。

OK,常用的YUV格式基本介绍完了,希望对大家有帮助。后面敬请关注《图样 too simple》系列之三:RAW10? 12? 14? bggr? 原来如此原始+土豪!

其他

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Laravel 虚拟开发环境 Homestead
下一篇:进程间通信——共享内存
相关文章